Могу ли я использовать библиотеку стилей C, созданную с помощью VC6, непосредственно в проекте VC9? - PullRequest
3 голосов
/ 26 октября 2009

Мы используем внутреннюю библиотеку (разработанную другой командой), созданную с помощью компилятора VC6. Эта библиотека в основном содержит API стилей C. У нас есть план перехода на компилятор Visual Studio 9. Стоит ли запрашивать сборку библиотеки с помощью компилятора VC9?

Более общий вопрос: по каким точкам (может быть искажение имени, оптимизация и т. Д.) DLL, созданная с использованием двух разных версий компилятора Visual Studio, отличается?

Ответы [ 2 ]

4 голосов
/ 26 октября 2009

Конфликт обычно происходит в библиотеке времени выполнения C. Основная идея заключается в том, что память должна быть освобождена в модуле, где она была выделена. Тогда будет безопасно использовать библиотеку, созданную с другой версией компилятора. Другая проблема - упаковка структур, но это не имеет значения, если вы используете только компилятор Visual C ++.

Имя искажения отличается от версии к версии в Visual C ++, но применяется только к библиотекам C ++. Если вы используете экспорт в стиле C (например, если у вас есть файл DEF), то вам не о чем беспокоиться.

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

2 голосов
/ 26 октября 2009

AFAIK, искажение имен в Visual C ++ стабильно от выпуска к выпуску.

Основная проблема заключается в том, что код, скомпилированный с одной версией, должен быть связан с CRTL для этой версии, и смешивание кода из нескольких версий в одной и той же DLL или EXE не будет работать, поскольку тогда оба объектных кода ожидают разные процедуры RTL.

С другой стороны, если вы связываете отдельные библиотеки DLL, содержащие разные библиотеки, это должно работать. В конце концов, в этом весь смысл DLL.

В этом сценарии я бы рекомендовал использовать только extern "C" API и (если это 32-битный код) явно указывать соглашение о вызовах (__stdcall__ или WINAPI или _cdecl ...)

Кроме того, есть тонкое замечание, когда у вашего приложения есть несколько копий CRTL: у вас есть несколько куч! и если объект размещается в одной куче и освобождается в другой куче, куча немедленно повреждается, и вы вылетаете.

В общем, если вы можете заставить их перекомпилироваться с вашим компилятором, это самая простая вещь.

...