Бинарная кросс-компиляторная совместимость библиотек C на Windows - PullRequest
4 голосов
/ 29 октября 2011

Мой вопрос похож на этот , но также касается статических библиотек:

У нас есть кросс-платформенная библиотека заголовков C ++, которая прекрасно работает под Windows / Linux / Os X, которая работаетна нескольких компиляторах и 32 и 64 бит.Когда у пользователя установлен zlib или libbz2, система сборки включает некоторые функции в библиотеке через #ifdefs.

Чтобы облегчить нашим пользователям, мы хотим поставлять библиотеки, такие как zlib и libbz2 для Windows,либо в двоичном формате, либо как источник с несколькими щелчками мыши для установки.(На Linux и Mac Os X библиотеки могут быть просто установлены, поскольку системные пакеты фактически доступны в большинстве стандартных установок, насколько я могу судить).

Окончательное решение должно позволить пользователям использоватьКомпиляторы Visual C / C ++ 2005, 2008 и 2010 годов, а также MinGW на 32- и 64-битной Windows для простой связи с zlib и libbz2.Мы занимаемся только библиотеками Си в настоящее время и в обозримом будущем.

Библиотеки должны создаваться отдельно, мы не хотим интегрировать их в нашу систему сборки.

Что касаетсяЯ вижу, что здесь есть как минимум две степени свободы:

  • Использовать ли статические библиотеки или библиотеки DLL.
  • Отправлять ли двоичные библиотеки или разрешать пользователям создавать свои собственные библиотеки.

Еще один момент заключается в том, что пользователи должны иметь возможность связывать библиотеки как с отладочными, так и с оптимизированными версиями своей программы.Я не эксперт в программировании Windows, но, насколько я мог узнать в Интернете и от других разработчиков на работе, есть (необычное?) Различие между сборками отладки и выпусков на Windows.По-видимому, вы не можете связать отладочные программы с библиотеками релизов и наоборот.Это правильно?

Хорошо, так что позвольте мне еще раз обобщить все это для ясности: (1) Каков наилучший способ доставки библиотек зависимостей C для нашего компилятора C ++? (2)Если позже мы также захотим поставлять библиотеки C ++, разрешить пользователю сборку из исходного кода с каждым компилятором - это единственно возможный способ, верно?

Ответы [ 2 ]

2 голосов
/ 29 октября 2011

Каков наилучший способ доставки библиотек зависимостей C для нашего компилятора C ++?

Идеального решения не существует, но вы значительно упростите работу пользователей, если отправите библиотеки DLL вместе с соответствующими заголовочными файлами и библиотеками импорта для компиляторов, которые, по вашему мнению, они будут использовать По крайней мере для Visual Studio. Обратите внимание, что большинство компиляторов предоставляют инструменты для создания библиотеки импорта из двоичного файла DLL.

Вы также можете отправлять библиотеки в исходном виде и предоставлять скрипт, который строит их на разных компиляторах.

Если позже мы также захотим поставлять библиотеки C ++, разрешить пользователю сборку из исходного кода с каждым компилятором - это единственно возможный способ, верно?

Как правило, очень плохая идея использовать библиотеки DLL, которые экспортируют классы и методы C ++, поскольку они экспортируются зависимым от компилятора способом, что заставляет вас предоставлять разные библиотеки DLL для каждого поддерживаемого компилятора. Я принимаю следующие меры при работе с библиотеками C ++:

  1. создавать статические библиотеки, а не библиотеки DLL.
  2. включает сборку библиотеки C ++ в сборку моего проекта (например, в качестве зависимого проекта), гарантируя, что все создается одним и тем же компилятором.

Если я правильно понимаю, ваши пользователи - это те, кто создает приложение, вы просто предоставляете им свою библиотеку заголовков. Так что в этом случае мне кажется, что вам нужно будет задокументировать, как они могут добавить библиотеку C ++ в свое приложение, и, возможно, лучший способ сделать это - предоставить полностью работающий пример приложения, которое также собирает библиотеку C ++ из исходного кода, по крайней мере нацелены на Visual Studio и любые другие компиляторы, которые, как вы знаете, могут использовать ваши пользователи.

Удачи.

1 голос
/ 29 октября 2011

Для максимальной двоичной совместимости лучший способ - представить ваши библиотеки c / c ++ как COM на платформе Windows.

COM-объекты могут использоваться из языков C, C ++ и .NET

...