2009-05-21 10 views
5

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

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 

ответ

5

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

+1

Через 20 секунд после того, как я это выяснил! Смотрите мой пост. Но это ответ;) – Veehmot

3

Ах ... Visual студия слишком умный для вас

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

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

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

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

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

+0

У меня этот набор уже нет. – Veehmot

4

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

Я объясню с точки зрения командной строки 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).

+0

Хороший пост. Однако это звучит как проблема с конфигурацией MSVC. –

+0

Спасибо за это, очень полезная информация, но это не решает мою проблему. Я хочу знать, как избежать зависимости * .obj. – Veehmot

 Смежные вопросы

  • Нет связанных вопросов^_^