5

我不确定这是为什么。我正在跨多个项目分发一个静态 *.lib,但这个静态库会生成许多 *.obj 文件。似乎我还需要使用 *.lib 分发那些 *.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
4

3 回答 3

5

我相信您的链接器行不正确。图书馆应该有一个.lib后缀。所以nsglCore应该是nsglCore-Win32-Release.lib或者可能nsglCore-$(TargetPlatform)-$(ConfigurationName).lib是正确的宏扩展是什么。

于 2009-05-21T03:49:05.153 回答
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 确实如此)。

于 2009-05-21T02:12:10.037 回答
3

啊……Vis​​ual Studio 对你来说太聪明了

转到包含lib的项目,右键单击属性

转到配置属性 | 链接器

靠近底部:使用库依赖输入 - 设置为否

这是直接获取 .obj 文件而不是 .lib 文件的 Visual Studio 选项。我想这是为了避免链接步骤,从而加快编译速度。

通常,您应该将创建 lib 文件的项目设置为使用它的项目的依赖项(在该属性窗口的公共属性下)。然后打开链接库依赖项。这在大多数情况下都很有效。

于 2009-05-21T02:11:19.537 回答