2009-05-21 74 views
5

我不知道這是爲什麼。我在多個項目中分配靜態* .lib,但是這個靜態庫會生成許多* .obj文件。好像我需要用* .lib分發這些* .obj文件。否則,我得到這個錯誤:靜態鏈接時爲什麼需要* .obj文件?

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

這是爲什麼?有沒有辦法將數據包含在* .lib文件中的* .obj文件中?也許編譯器中的開關?

這是我的靜態庫的配置:

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 

鏈接

/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.libnsglCore-$(TargetPlatform)-$(ConfigurationName).lib或任何正確的宏擴展。

3

啊... Visual Studio是被你

走得太聰明,包括的lib項目,右點擊屬性

轉到配置屬性|鏈接

接近底部:使用圖書館扶養輸入 - 設置爲無

這是一個Visual Studio選項搶.obj文件,而不是直接的。LIB文件。我想這是爲了避免鏈接步驟,從而加快編譯速度。

通常,您應該將創建lib文件的項目設置爲使用它的項目的依賴項(在該屬性窗口中的常用屬性下)。然後打開鏈接庫依賴關係。這在大多數情況下運作良好。

+0

我已經設置爲no。 – Veehmot 2009-05-21 02:40:38

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配置問題。 – 2009-05-21 02:14:29

+0

感謝您提供非常有用的信息,但這並不能解決我的問題。我想知道一種避免* .obj依賴性的方法。 – Veehmot 2009-05-21 02:41:55

相關問題