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

StackOverflow https://stackoverflow.com/questions/1624648

  •  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: у вас есть несколько куч! и если объект размещается в одной куче и освобождается в другой куче, куча будет немедленно повреждена, и вы потерпите крах.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top