在Visual Studio后期生成事件中使用lnk.exe从.lib文件中删除特定对象 我有一个C++项目,我用谷歌测试来编写我的单元测试。这个项目已经存在了一段时间,非常混乱,所以我只是在主函数的开头添加了一行代码,开始单元测试,然后退出程序。然后我会注释并取消注释这一行,以便在单元测试和实际应用程序之间切换

在Visual Studio后期生成事件中使用lnk.exe从.lib文件中删除特定对象 我有一个C++项目,我用谷歌测试来编写我的单元测试。这个项目已经存在了一段时间,非常混乱,所以我只是在主函数的开头添加了一行代码,开始单元测试,然后退出程序。然后我会注释并取消注释这一行,以便在单元测试和实际应用程序之间切换,c++,visual-studio-2010,googletest,C++,Visual Studio 2010,Googletest,当我只使用我的代码时,这很有效,但现在我正试图以一种适当的方式解决这一问题,使用两个项目和.exe文件,一个用于实际应用程序,一个用于测试,如图萨的回答: 他的解释如下: 问题是所有的.obj文件都放在这个库中,包括main函数。这使得我无法与testmain链接,因为已经定义了_main。我尝试将“/REMOVE”选项添加到命令中,结果如下: lib /NOLOGO /OUT:"$(TargetPath).lib" /REMOVE:"$(ProjectDir)$(Configuration

当我只使用我的代码时,这很有效,但现在我正试图以一种适当的方式解决这一问题,使用两个项目和.exe文件,一个用于实际应用程序,一个用于测试,如图萨的回答:

他的解释如下:

问题是所有的.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
关于如何写入对象文件的名称,我发现的唯一内容是:

他们写道:

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

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


我做错了什么?有没有什么地方我键入了错误的内容,或者有没有更简单的方法来解决这个问题?

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

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

三个项目。可测试代码库,链接到库的主应用程序,链接到库的测试应用程序。是的,我也尝试过这个解决方案,但由于之前编写这个项目的人,所有代码都是构建在一起的。所有内容都包括stdafx.h,而stdafx.h又包括其他所有内容。“类”不继承,只检查一个类型变量,调用“子类”的静态方法,该方法检查一个数字参数,在该子类的全局数组中找到正确的对象,最后调用正确的方法。我想找一条捷径,让我的测试在另一个项目中进行,而不是解决这个问题。将应用程序更改为库,并将
main
重命名为
ApplicationEntry
或其他名称,然后在新的应用程序项目中调用
main
。与引入另一个对下一个开发人员来说很难维护的元素相比,最少的重构和更少的头痛。是的,这是一种更简单的解决方案。谢谢:)我听从了Captain Obvlious的建议,将项目分为三个部分:一个包含真实代码的库项目,一个测试项目,然后是一个仅从库中创建exe文件的小项目。这已经很好地工作了将近三年,我在其他项目中也重复了这一点。向新朋友解释也很容易!