Являются ли скомпилированные.lib файлы взаимозаменяемыми для разных версий Microsoft Visual C++?
Некоторые проекты предоставляют единый набор двоичных файлов "Windows" для библиотек C (и, возможно, C++ - не уверен). Например, смотрите ссылки на правой стороне этой связанной с libxml страницы.
Я почти уверен, что нет никакого способа конвертировать между файлами VC++ .lib и MinGW GCC .a, поэтому называть их двоичными файлами "Windows", а не "Microsoft" кажется немного вводящим в заблуждение. Но я также удивлен, что нет очевидной необходимости в разных двоичных файлах для разных версий VC++.
Кажется, я помню, много лет назад, были проблемы с написанием плагинов для музыкальной программы в стиле трекера (Jeskola Buzz), потому что эта программа использовала VC++6, а я обновился до VC++7. Я не помню точную проблему - возможно, она была частично связана с DLL, но я знаю, что не нужно заботиться о версии VC++. Я думаю, что проблема связана с предоставленными.lib файлами и, возможно, также с библиотеками времени выполнения, с которыми они связаны. Впрочем, это было очень давно, поэтому все немного расплывчато.
В любом случае, могут ли библиотеки, скомпилированные одной версией MS VC++, быть связаны с проектами, созданными с другой версией? Какие ограничения применяются, если таковые имеются?
Мне интересны библиотеки C и C++, которые будут вызываться из проектов C++ (я редко использую C, за исключением библиотек C, вызываемых из C++).
1 ответ
Формат MS COFF (.lib, .obj и т. Д.) Одинаков для всех версий VC++ и даже для других языков.
Проблема в том, что файлы.obj зависят от других файлов.obj (.lib).
Для кода C++ есть большая вероятность, что код не скомпилируется с новой версией реализации стандартной библиотеки VC++. Например, использовалась старая версия CRT extern "C++" void internal_foo(int)
и более новые CRT использует extern "C++" void internal_foo(int, int)
, так что компоновщик потерпит неудачу с ошибкой "неразрешенный внешний символ". Для кода на С есть вероятность, что код скомпилируется, потому что для extern "C"
, имена символов не кодируют всю подпись. Но во время выполнения приложения произойдет сбой после вызова этой функции.
То же самое может произойти, если компоновка какой-либо структуры данных изменится, компоновщик не обнаружит ее.