2009-05-21 75 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

相关问题