Зачем мне файл * .obj при статической компоновке? - PullRequest
5 голосов
/ 21 мая 2009

Я не уверен, почему это так. Я распространяю статический * .lib по нескольким проектам, но этот статический lib генерирует много файлов * .obj Похоже, мне нужно распространять также эти * .obj файлы с * .lib. В противном случае я получаю эту ошибку:

1>LINK : fatal error LNK1181: cannot open input file 'nsglCore.obj'

Почему это? Есть ли способ включить данные в файлы * .obj в * .lib? Может быть, переключатель в компиляторе?

Это мой конфиг для статической библиотеки:

C / C ++

/Od /GT /D "WIN32" /D "NDEBUG" /D "_LIB" /D "_WINDOWS" /D "_UNICODE" /D "UNICODE" /Gm /EHsc /MD /Yu"stdafx.hpp" /Fp"e:\Development\Projects\nsGameLib\Source\Core\Intermediate\nsglCore-Win32-Release.pch" /Fo"e:\Development\Projects\nsGameLib\Source\Core\Intermediate\\" /Fd"e:\Development\Projects\nsGameLib\Source\Core\Intermediate\vc90-Release.pdb" /W3 /nologo /c /Zi /TP /errorReport:prompt

Библиотекарь

/OUT:"e:\Development\Projects\nsGameLib\Source\Core\Output\nsglCore-Win32-Release.lib" /NOLOGO /LTCG

Это мой конфиг для проекта с использованием статической библиотеки:

C / C ++

/O2 /Oi /I "E:\Development\Projects\nsGameLib\Samples\\DummyEngine\\" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_UNICODE" /D "UNICODE" /FD /EHsc /MD /Gy /Fo"e:\Development\Projects\nsGameLib\Samples\OnlyCore\Intermediate\\" /Fd"e:\Development\Projects\nsGameLib\Samples\OnlyCore\Intermediate\vc90-Release.pdb" /W3 /nologo /c /Zi /TP /errorReport:prompt

Linker

/OUT:"e:\Development\Projects\nsGameLib\Samples\OnlyCore\Output\SampleOnlyCore-Win32-Release.exe" /INCREMENTAL:NO /NOLOGO /LIBPATH:"E:\Development\Projects\nsGameLib\Samples\..\Deployment\Libraries" /MANIFEST /MANIFESTFILE:"e:\Development\Projects\nsGameLib\Samples\OnlyCore\Intermediate\SampleOnlyCore-Win32-Release.exe.intermediate.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"e:\Development\Projects\nsGameLib\Samples\OnlyCore\Intermediate\SampleOnlyCore-Win32-Release.pdb" /SUBSYSTEM:WINDOWS /OPT:REF /OPT:ICF /LTCG /DYNAMICBASE /NXCOMPAT /MACHINE:X86 /ERRORREPORT:PROMPT nsglCore  kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib

Ответы [ 3 ]

5 голосов
/ 21 мая 2009

Я считаю, что ваша строка компоновщика неверна. Библиотека должна иметь суффикс .lib. Таким образом, nsglCore должно быть nsglCore-Win32-Release.lib или, может быть, nsglCore-$(TargetPlatform)-$(ConfigurationName).lib или любым другим правильным расширением макроса.

4 голосов
/ 21 мая 2009

Как правило, статические библиотеки не генерируют объектные файлы. Что вы делаете, это создаете объектные файлы и помещаете их в библиотеку, тогда компоновщик будет искать объектные файлы в этих библиотеках.

Я объясню с точки зрения командной строки UNIXy, поскольку это проще для понимания (я понятия не имею, что делает махинации VS, прежде чем делать основные вещи).

Пример командной строки для создания исполняемого файла:

gcc -c -o prog.o prog.c
gcc -o prog prog.o -L/libdir -lstdc

Первая строка просто создает объектный файл из вашего C файла. Во второй строке создается исполняемый файл путем объединения объектных файлов, как правило, в соответствии с набором правил, подобным следующему:

  • Все файлы .o, перечисленные в явном виде, связаны между собой.
  • Как только это будет сделано, вы будете искать в библиотеках другие объекты, которые удовлетворяют указанным, но не определенным символам.

Например, скажем, ваш prog.c содержал строку printf("hello\n");. Это приведет к тому, что ваш файл prog.o содержит ссылку на printf, которая еще не удовлетворена.

Компоновщик будет искать в указанных вами библиотеках до тех пор, пока не будет удовлетворен этой ссылке. В этом случае он будет искать все файлы вида /libdir/libstdc.ext, где:

  • /libdir из вашей опции -L (путь для поиска библиотек в).
  • /lib является константой.
  • stdc - это имя библиотеки для поиска (от -l).
  • ext - это одно или несколько расширений (.a, .so, .sl и т. Д.).

Как только символ найден, этот объектный файл связывается для его разрешения. Это может привести к появлению больше неудовлетворенных символов, таких как /libdir/libstdc.a(printf.o) со ссылкой на /libdir/libstdc.a(putch.o).

Ваша конкретная проблема может быть вызвана тем, что вы пытаетесь связать объектный файл напрямую, а не искать в библиотеках. В VS должны быть опции проекта для указания объектных файлов, путей поиска библиотек и имен библиотек (я не уверен в этом для последних версий, но знаю, что более ранние версии MSVC делали).

3 голосов
/ 21 мая 2009

Ах ... Visual Studio слишком умён для вас

Перейдите к проектам, которые включают lib, щелкните правой кнопкой мыши для свойств

Перейти к свойствам конфигурации | Linker

В нижней части: Использовать входы зависимостей библиотеки - Установите на Нет

Это опция Visual Studio для непосредственного захвата файлов .obj, а не файла .lib. Я полагаю, что нужно избегать шага ссылки и тем самым ускорить компиляцию.

В общем, вы должны установить проект, который создает файл lib, как зависимость от проекта, который его использует (в общих свойствах в этом окне свойств). Затем вы включаете зависимости библиотеки ссылок. Это работает хорошо в большинстве случаев.

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