Могу ли я использовать библиотеку стилей C, созданную с помощью VC6, непосредственно в проекте VC9?
-
06-07-2019 - |
Вопрос
Мы используем внутреннюю библиотеку (разработанную другой командой), созданную с помощью компилятора VC6. Эта библиотека в основном содержит API стилей C. У нас есть план перехода на компилятор Visual Studio 9. Стоит ли запрашивать сборку библиотеки с помощью компилятора VC9?
Более общий вопрос: чем отличается (может быть искажение имени, оптимизация и т. д.) DLL, созданная с использованием двух разных версий компилятора Visual Studio?
Решение
Конфликт обычно происходит в библиотеке времени выполнения C. Основная идея заключается в том, что память должна быть освобождена в модуле, где она была выделена. Тогда будет безопасно использовать библиотеку, созданную с другой версией компилятора. Другая проблема - упаковка структур, но это не имеет значения, если вы используете только компилятор Visual C ++.
Перенос имени отличается от версии к версии в Visual C ++, но применяется только к Библиотеки C ++. Если вы используете экспорт в стиле C (например, если у вас есть файл DEF), тогда вам не о чем беспокоиться.
Этот вопрос не является полным вашим дубликатом, но может оказаться полезным.
Другие советы
AFAIK, искажение имен в Visual C ++ стабильно от выпуска к выпуску.
Основная проблема заключается в том, что код, скомпилированный с одной версией, должен быть связан с CRTL для этой версии, и смешивание кода из нескольких версий в одну и ту же DLL или EXE не будет работать, потому что тогда оба объектных кода ожидают разные процедуры RTL. р>
С другой стороны, если вы связываете отдельные библиотеки DLL, содержащие разные библиотеки, это должно работать. В конце концов, в этом весь смысл DLL.
В этом сценарии я бы рекомендовал использовать только API extern " C "
и (если это 32-битный код) явно указывать соглашение о вызовах ( __stdcall __
или WINAPI
или _cdecl
...)
Кроме того, есть тонкое замечание, когда ваше приложение имеет несколько копий CRTL: у вас есть несколько куч! и если объект размещается в одной куче и освобождается в другой куче, куча будет немедленно повреждена, и вы потерпите крах.
В общем, если вы можете заставить их перекомпилироваться с вашим компилятором, это самая простая вещь.