gpt4 book ai didi

c++ - 在 Visual Studio Post-Build 事件中使用 lnk.exe 从 .lib 文件中删除特定对象

转载 作者:太空宇宙 更新时间:2023-11-04 11:24:19 24 4
gpt4 key购买 nike

我有一个 C++ 项目,我在其中使用 Google Test 编写我的单元测试。该项目已经存在了一段时间并且非常困惑,所以我只是在 main 函数的开头添加了一行,用于启动单元测试然后退出程序。然后我会评论和取消评论这一行,以便在单元测试和实际应用程序之间切换。

当我只使用我的代码时,这很有效,但现在我正在尝试以正确的方式解决这个问题,有两个项目和 .exe 文件,一个用于实际应用程序,一个用于测试,就像 toussa 在这里的回答: Visual Studio C++: Unit test exe project with google test?

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

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

lib /NOLOGO /OUT:"$(TargetPath).lib" /REMOVE:"$(ProjectDir)$(Configuration)\mainfile.obj" "$(ProjectDir)$(Configuration)\*.obj"

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

LINK : warning LNK4014: cannot find member object C:\dev\solutions\currentSolution\currentProject\Debug\mainfile.obj

关于如何编写目标文件的名称,我唯一找到的是从这里: http://msdn.microsoft.com/en-us/library/5ff8sk86(v=vs.100).aspx

他们写的地方:

The /REMOVE and /EXTRACT options require the full name of the member object that is to be deleted or copied to a file. The full name includes the path of the original object file. To see the full names of member objects in a library, use DUMPBIN /ARCHIVEMEMBERS or LIB /LIST.

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

我做错了什么?有没有我输入错误的地方,或者是否有更简单的解决方案?

最佳答案

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

lib /NOLOGO /OUT:"$(TargetPath).lib" "$(ProjectDir)$(Configuration)\*.obj"
lib /NOLOGO "$(TargetPath).lib" /REMOVE:"$(ProjectDir)$(Configuration)\mainfile.obj"

关于c++ - 在 Visual Studio Post-Build 事件中使用 lnk.exe 从 .lib 文件中删除特定对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27213874/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com