Являются ли скомпилированные .lib файлы взаимозаменяемыми для разных версий Microsoft Visual C ++? - PullRequest
9 голосов
/ 09 декабря 2011

Некоторые проекты предоставляют единый набор двоичных файлов 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 Ответ

4 голосов
/ 09 декабря 2011

Формат MS COFF (.lib, .obj и т. Д.) Одинаков для всех версий VC ++ и даже для других языков.

Проблема в том, что файлы .obj зависят от других .obj (.lib) files.
Для кода C ++ есть большая вероятность, что код не скомпилируется с новой версией реализации стандартной библиотеки VC ++.Например, старая версия CRT использовала extern "C++" void internal_foo(int), а более новая CRT использовала extern "C++" void internal_foo(int, int), поэтому компоновщик потерпит неудачу с ошибкой «неразрешенный внешний символ».Для кода C существует вероятность того, что код скомпилируется, потому что для extern "C" имена символов не кодируют всю сигнатуру.Но во время выполнения приложения происходит сбой после вызова этой функции.
То же самое может произойти, если компоновка какой-либо структуры данных изменится, компоновщик не обнаружит ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...