在 Visual Studio 构建后事件中使用 lnk.exe 从 .lib 文件中删除特定对象

MrB*_*rta 3 c++ googletest visual-studio-2010

我有一个 C++ 项目,我使用 Google Test 来编写单元测试。该项目已经存在了一段时间并且相当混乱,因此我只是在 main 函数的开头添加了一行,用于启动单元测试,然后退出程序。然后,我将注释和取消注释这一行,以便在单元测试和实际应用程序之间切换。

当只有我使用我的代码时,这工作正常,但现在我试图以正确的方式解决这个问题,使用两个项目和 .exe 文件,一个用于实际应用程序,一个用于测试,就像图萨在这里的答案: Visual Studio C++:使用 google test 进行单元测试 exe 项目?

他对此的解释如下: Linking to multiple .obj for unit test a console application

问题是所有 .obj 文件都放入该库中,包括 main 函数。这使得我无法链接到我的 testmain,因为 _main 已经定义了。我尝试在命令中添加“/REMOVE”选项,所以它看起来像这样:

lib /NOLOGO /OUT:"$(TargetPath).lib" /REMOVE:"$(ProjectDir)$(Configuration)\mainfile.obj" "$(ProjectDir)$(Configuration)\*.obj"
Run Code Online (Sandbox Code Playgroud)

我希望 mainfile.cpp 被编译为 mainfile.obj。lnk 的输出是:

LINK : warning LNK4014: cannot find member object C:\dev\solutions\currentSolution\currentProject\Debug\mainfile.obj
Run Code Online (Sandbox Code Playgroud)

我发现的关于如何编写目标文件名称的唯一信息是来自这里: http://msdn.microsoft.com/en-us/library/5ff8sk86 (v=vs.100).aspx

他们写道:

/REMOVE 和 /EXTRACT 选项需要要删除或复制到文件的成员对象的全名。全名包括原始目标文件的路径。要查看库中成员对象的全名,请使用 DUMPBIN /ARCHIVEMEMBERS 或 LIB /LIST。

如果我输入这两个中的任何一个,我会得到一个列表,其中“C:\dev\solutions\currentSolution\currentProject\Debug\mainfile.obj”是其中一个条目。

我究竟做错了什么?我是否有什么地方输入错误,或者是否有更简单的解决方案来解决这个问题?

小智 5

我在使用 Google Test 为控制台应用程序构建单元测试时遇到了完全相同的问题。我通过将构建后操作拆分为两个单独的库调用来解决这个问题。第一个从所有 *.obj 文件构建库。第二次调用从 *.lib 文件中删除带有 main 函数的 *.obj 文件。在你的情况下,电话将是:

lib /NOLOGO /OUT:"$(TargetPath).lib" "$(ProjectDir)$(Configuration)\*.obj"
lib /NOLOGO "$(TargetPath).lib" /REMOVE:"$(ProjectDir)$(Configuration)\mainfile.obj"
Run Code Online (Sandbox Code Playgroud)