Учитывая ваши требования, вам понадобится статическая библиотека (например, .lib под windows), которая будет связана с вашей программой на этапе сборки.
Интерфейс этой библиотеки должен находиться в заголовочном файле, который объявляет типы и функции.
Вы можете распространять в виде набора библиотек и заголовочных файлов, если они могут быть чисто разбиты на отдельные части - если вы управляете зависимостями между частями. Это необязательно.
Вы не сможете определить свои собственные шаблонные функции или классы, так как (с большинством компиляторов) это требует распространения исходного кода для этих функций или классов. Или, если вы это сделаете, вы не сможете использовать их как часть интерфейса с библиотекой (например, вы можете использовать шаблонные функции / классы внутри библиотеки, но не предоставлять их в заголовочном файле библиотеки пользователям библиотека).
Основным недостатком является то, что вам нужно будет создать и распространить версию библиотеки для каждого компилятора и хост-системы (в комбинации, которую вы поддерживаете). Стандарт C ++, в частности, поощряет различные типы несовместимостей (например, различные искажения имен) между компиляторами, поэтому, вообще говоря, код, созданный с помощью одного компилятора, не будет взаимодействовать с кодом, созданным с помощью другого компилятора C ++. Практически, ваша библиотека не будет работать с компилятором, отличным от того, с которым она построена, если только эти компиляторы специально не реализованы (например, по соглашению обоих поставщиков) для совместимости. Если вы поддерживаете компилятор, который поддерживает разные ABI между версиями (например, g++
), то вам нужно будет распространять версию вашей библиотеки, созданную для каждой версии ABI (например, самую последнюю версию компилятора, которая поддерживает каждый ABI)
Положительным моментом, который следует из сборки вашей библиотеки для каждого поддерживаемого вами компилятора и хоста, является то, что не будет проблем с использованием стандартной библиотеки, включая шаблонные типы или функции в стандартной библиотеке. Передача аргументов будет работать. Стандартные типы библиотек могут быть членами ваших классов. Это просто потому, что библиотека и программа, использующая ее, будут собраны с одним и тем же компилятором.
Вам нужно будет тщательно включать стандартные заголовки (например, не полагаться на один стандартный заголовок, включая другой, если стандарт не говорит, что это действительно так - некоторые поставщики библиотек менее строгие в этом, что может привести к поломке вашего кода). при сборке с разными компиляторами и их стандартными библиотеками).
В большинстве случаев вам не понадобятся версии «Debug» и «Release» (или версии с другими настройками оптимизации) вашей библиотеки. Вообще говоря, нет проблем с связанными частями программы, которые компилируются с различными настройками оптимизации. (Это может привести к поломке, если вы - или программист, использующий вашу библиотеку в своей программе - используете экзотические комбинации опций сборки, поэтому сведите их к минимуму). Распространение «отладочной» версии вашей библиотеки позволит вам пройти через вашу библиотеку с помощью отладчика, который кажется противоречащим вашим пожеланиям.
Ничто из вышеперечисленного не мешает вам использовать пользовательские распределители, но также не требует этого.
Вам не нужно будет воссоздавать COM, если вы действительно этого не хотите. Фактически, вы должны стремиться к тому, чтобы ваш код был как можно более стандартным - минимизировать использование специфичных для компилятора функций, не делать особых предположений о размерах типов или расположении типов и т. Д. Использование специфических для поставщика функций, таких как COM, не рекомендуется. -нет, если эти функции не поддерживаются единообразно всеми целевыми компиляторами и системами, которые вы поддерживаете. Какой COM не является.
Я не знаю, существует ли "стандартный / канонический" способ сделать это. Написание кода, который работает для нескольких компиляторов и хост-систем, является нетривиальной задачей, потому что существуют различия в том, как разные поставщики компиляторов интерпретируют или поддерживают стандарт. Лучше сохранять простой код - чем экзотичнее или новее используемая вами функция языка или стандартной библиотеки, тем больше вероятность того, что в некоторых компиляторах вы столкнетесь с ошибками.
Кроме того, уделите время настройке набора тестов для своей библиотеки и регулярно поддерживайте его, чтобы он был максимально полным. Протестируйте свою библиотеку с этим набором на каждой комбинации компилятора / системы, которую вы поддерживаете.