Являются ли скомпилированные.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", имена символов не кодируют всю подпись. Но во время выполнения приложения произойдет сбой после вызова этой функции.
То же самое может произойти, если компоновка какой-либо структуры данных изменится, компоновщик не обнаружит ее.

Другие вопросы по тегам