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

У меня 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>

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


person user366312    schedule 01.08.2015    source источник
comment
Создайте проект. Добавьте файлы в проект. Однако командная строка намного лучше.   -  person David Heffernan    schedule 01.08.2015
comment
Это потому, что вы неправильно настроили переменные env.   -  person David Heffernan    schedule 01.08.2015
comment
Чтобы создать .lib, используйте lib.exe.   -  person James McNellis    schedule 01.08.2015
comment
Измените свой вопрос и разместите информацию в вопросе, а не в комментариях.   -  person Thomas Matthews    schedule 01.08.2015
comment
К вашему сведению, компилятор Microsoft позволяет вам напрямую ссылаться на файлы .obj, как если бы они были файлами lib. Возможно, они вам не понадобятся как библиотеки.   -  person VoidStar    schedule 11.08.2015
comment
@VoidStar, да, я знаю.   -  person user366312    schedule 11.08.2015


Ответы (2)


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

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 и C ++ (например, 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) (для каждого пользователя или системы), но они также могут быть указаны в командной строке с помощью _ 7_ и _ 8_ следующим образом;

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

Методические рекомендации;

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

Ваша ошибка LNK1104

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

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

person Niall    schedule 05.08.2015
comment
Да, вы были правы, речь шла о разрешении и выборе инструмента. Прежде чем я награду вас наградой, не могли бы вы рассказать мне, как развернуть файлы библиотеки, чтобы мне не нужно было включать заголовки C ++, такие как #include "graphics.h" ?? Вместо этого я хочу написать #include <cgraphics> или, по крайней мере, #include <graphics.h>. - person user366312; 05.08.2015
comment
@ анонимный. Я не уверен, что вы имеете в виду под развертыванием библиотеки. Заголовочный файл необходим во время компиляции во время сборки. Файлы lib необходимы во время компоновки в сборке, а не во время выполнения на целевой машине. DLL потребуется во время выполнения. Заголовочный файл обычно не содержит ничего, кроме определений, необходимых для кода в библиотеке или dll (по сути, это будут объявления классов и функций, а не какой-либо код) ... - person Niall; 06.08.2015
comment
Если вам нужно распространить библиотеку для других людей, чтобы построить ее на основе dll, эта импортная библиотека включает в себя ровно столько кода, чтобы связать ее с exe, чтобы загрузить dll и исправить указатели функций. Разница между "" и <> формой включения заключается в том, как препроцессор находит файл заголовка. <> просматривает путь включения, а "" ищет файл локально - имя файла на самом деле не имеет значения - это просто по соглашению. Если разделить библиотеку и заголовок для сборки, то, вероятно, будет лучше <> ... - person Niall; 06.08.2015
comment
MSVC включает директиву #pragma(lib, "mylib.lib"), которая помогает при связывании, но она эквивалентна добавлению библиотеки в качестве аргумента компоновщика. Все это сильно отличается от сборок C # и т. Д., Которые по существу не имеют прямого эквивалента файлам lib. - person Niall; 06.08.2015
comment
@ анонимный. Я знаю, что это было немного долго, но я надеюсь, что это поможет вам с некоторыми аспектами сборки C ++? - person Niall; 06.08.2015
comment
Я имею в виду, я просто хочу, чтобы graphics.lib и graphics.h вели себя как любая другая стандартная библиотека C ++ с точки зрения пути и директивы #include. - person user366312; 06.08.2015
comment
Позвольте нам продолжить это обсуждение в чате. - person Niall; 06.08.2015

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

person mksteve    schedule 10.08.2015