Как создавать статические и динамические библиотеки из .obj файлов для Visual С++?

У меня есть Visual Studio 2008, 64-разрядная версия Windows7.

Я использую графическую библиотеку WinBGIm.

Эта библиотека поставляется с некоторыми .obj файлами. Файлы .lib или .dll отсутствуют.

Я хочу преобразовать их в статические .lib и динамические .dll файлы.

Я скопировал все файлы .obj в каталог:

C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\amd64

Но следующая команда не работает:

C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\amd64>lib.exe /out:bgiout.lib *.obj
Microsoft (R) Library Manager Version 9.00.21022.08
Copyright (C) Microsoft Corporation.  All rights reserved.

LINK : fatal error LNK1104: cannot open file 'bgiout.lib'

C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\amd64>

Как это сделать?

Ответ 1

Да, вы можете сделать это, в значительной степени, как и у вас.

C:\Code\bgi\obj>lib /out:libbgi.lib *.obj

LIB (lib.exe) используется для создания статических библиотек. LINK (link.exe/DLL) используется для создания динамических библиотек (он создает DLL и библиотеку импорта .lib).

C:\Code\bgi\obj>link /DLL /out:bgi.dll *.obj [additional libs]

При использовании команды link /DLL потребуются дополнительные стандартные библиотеки времени исполнения Win32 и С++ (такие как библиотеки MSVCRT.lib и User32.lib и т.д. и библиотеки MFC).

В этом случае; это, по-видимому, правильные аргументы компоновщика;

C:\Code\bgi\obj>link /DLL /out:bgi.dll *.obj MSVCRTD.lib User32.lib Gdi32.lib ole32.lib Comdlg32.lib OleAut32.lib

Примечание. Созданные объектные файлы являются версиями отладки, поэтому MSVCRTD.lib(обратите внимание на D) является тем, который будет использоваться здесь. С приведенными выше командами мне удалось успешно связать как .dll, так и статический .lib.

Дополнительные пути и библиотеки;

При распространении этих выходов для других сборок в целевой сборке может потребоваться дополнительный путь к заголовку и библиотеке. Чтобы добавить дополнительные места в пути поиска и поиска библиотек, переменные среды (INCLUDE и LIB) могут быть добавлены (для каждого пользователя или для всей системы), но они также могут быть указаны в командной строке через /I и /LIBPATH следующим образом:

cl /IC:\Code\include [additional options] main.cpp
link /LIBPATH:C:\Code\lib [additional options] xyz.lib

Руководство;

  • Запустите командную строку "Visual Studio", если в 2008 году должна быть ссылка в меню "Visual Studio 2008 Command Prompt". Этот командный файл установит правильную среду для сборки С++. Убедитесь, что они соответствуют правильной инструментальной цепочке для целей x86 или x64.
  • Перейдите в каталог, содержащий файлы объектов.
  • Запустите команды (ы), которые у вас есть (как указано выше).

Ваша ошибка LNK1104

Я подозреваю, что у вас есть ошибка, LNK1104, скорее всего, потому что у вашего пользователя нет достаточного разрешения писать файлы в рамках "Программы Файлы". Кроме того, это может быть ошибка с использованием неправильной инструментальной цепочки для вашей цели (x86 против x64).

Как правило, лучше сделать это в своем собственном каталоге; например: "C:\Code\bgi".

Ответ 2

Современные компиляторы С++ будут вставлять информацию о нуждающихся библиотеках. Для visual studio файл .obj включает ссылку на библиотеки С++, на которые он опирается (/MT/MD/MTd/MDd), эти библиотеки имеют несколько иные реализации и несовместимы с ними. Единственный выбор - иметь исходный код или несколько файлов .obj для каждого поддерживаемого режима сборки.