Являются ли libfoo.a и foo.lib совместимыми форматами? - PullRequest
4 голосов
/ 12 августа 2009

Некоторые сценарии сборки (например, в numpy) просто делают следующее, чтобы заставить скомпилированный gcc архив библиотеки работать с компоновщиком Visual Studio:

copy libfoo.a foo.lib

Удивительно, но это похоже на работу. Кто-нибудь знает почему?

Ответы [ 2 ]

3 голосов
/ 17 августа 2009

В зависимости от нескольких факторов, это может работать или не работать - и по нескольким причинам. Я так понимаю, вы имеете в виду полную, обратимую совместимость.

  1. Для implibs, которые используются для привязки DLL к исполняемым файлам, ответом является no .

    Однажды я пытался связать Implib MSVC ++ с DLL, созданным gcc. Если бы форматы были совместимы, это сработало бы, когда я переименовал библиотеку libfoo.a. Чтобы обойти это, существует утилита reimp, которая может создать подходящий gcc implib из DLL. Чтобы полностью изменить процесс, инструмент lib от microsoft может создать статический имплиб из файла .def, который gcc может создать с помощью DLL, если ему будут заданы правильные флаги. [Поиск "reimp" на веб-сайте MINGW для получения дополнительной информации]
  2. C ++ - скомпилированные объектные файлы также несовместимы из-за искажения имен .

    Различные компиляторы C ++ по-разному манипулируют именами переменных и объектов, что приводит к «коду [объекта] ... который обычно не является связываемым»
  3. Для статической библиотеки, скомпилированной как обычный старый C? Да

    Мне нужно немного больше информации о том, к какому типу проекта вы относитесь, но если это C и хак `copy libfoo.a foo.lib`, это может иметь место. Попробуйте проверить, работает ли это в обратном порядке с Mingw или Dev-C ++. Редактировать : На самом деле, это будет работать только тогда, когда библиотека скомпилирована с помощью gcc на платформе Windows (и она работает в обоих направлениях!). единственное исключение из этого AFAIK - это кросс-скомпилированные библиотеки - MSVC отказывается принимать их, по крайней мере, с предоставленной Ubuntu «i586-mingw32msvc-ar».

Другое альтернативное объяснение состоит в том, что компоновщик MSVC совместим с форматом .a по историческим причинам. IIRC, это было со времен UNIX. Опять же, хотя я мог видеть, что это работает только для чистого C, а не C ++.
РЕДАКТИРОВАТЬ : Это на самом деле наоборот. Версия инструментария GCC для Windows создает статические библиотеки, совместимые с форматом Microsoft COFF.

1 голос
/ 12 августа 2009

Хотя я не знаю каких-либо подробностей о формате lib, я могу предоставить некоторую информацию о формате lib * .a. Это просто архив объектных файлов * .o, и им можно управлять с помощью программы ar (часть binutils ).

prompt>ar t /usr/lib64/libc.a | head
init-first.o
libc-start.o
sysdep.o
version.o
check_fds.o
libc-tls.o
elf-init.o
dso_handle.o
errno.o
errno-loc.o
prompt>ar t /usr/lib64/libc.a | wc
   1447    1447   16904
prompt>

Я предполагаю, что * .lib также является архивом объектных файлов с идентичным или совместимым индексом содержимого.

...