Gtest 测试项目链接到其他可执行文件

Posted

技术标签:

【中文标题】Gtest 测试项目链接到其他可执行文件【英文标题】:Gtest test project link to other executable 【发布时间】:2016-11-23 08:42:24 【问题描述】:

我有一个项目,我添加了一个 gtest 项目,然后将原始项目转换为 .lib 项目,并从第三个新项目中调用其 main() 函数。这样,我可以使用项目 .exe 构建测试 .exe。除了,它不起作用。

这些是我提到的here 创建或打开一个项目,然后为其创建一个 Win32 控制台应用程序测试项目。 右键单击测试项目,转到属性,然后将配置设置为调试。 转到配置属性 > C/C++ > 常规 > 附加包含目录并添加 gtest 包含文件夹。 在 Code Generation > Runtime Library 下,选择 MDt 或 MTd;待测试项目使用的任何内容。 在 Linker > General > Additional Library Directories 下,使用 gtestd.lib 添加对文件夹的引用。 在 Input > Additional Dependencies 下,添加 gtestd.lib。 右键单击测试项目,进入属性,将配置设置为发布,然后执行步骤 3 和 4。 在 Linker > General > Additional Library Directories 下,使用 gtest.lib 添加对文件夹的引用。 在 Input > Additional Dependencies 下,添加 gtest.lib。

这些是我为链接测试项目所遵循的步骤,如提到的here 右击测试项目,进入Build Dependencies > Project Dependencies,添加要测试的项目。 转到属性 > C/C++ > 常规 > 附加包含目录并包含项目中的标头以进行测试。 在 Linker > Input > Additional Dependencies 下,输入项目的.lib 文件

问题出在这里 出于某种原因,测试项目出人意料地工作,但仅在 release 模式下。尽管与测试项目具有相同的设置,包装项目在这两种模式下都不起作用。我已经查看了 20 种可能的解决方案,但还没有找到一个。我还在库项目中的每个方法前尝试了 __declspec(dllexport),但这并没有起到任何作用。 VS 正在与我作斗争。

我尝试过的其他东西 我不想每次需要测试时都更改项目以构建 .lib。所以我考虑使用预链接构建事件从项目中创建 .exe.lib,但它似乎只接受控制台命令,我不能弄清楚如何从我从另一个 SO 答案得到的控制台命令中连接生成的 .lib 文件。

这是当前存在这些问题的 .sln 文件。 URL 是绝对的:https://drive.google.com/file/d/0B6r81tGW7hODeXNpR3ROc3hYMWc/view?usp=sharing

我如何简单地创建一个测试项目和包装项目来启动一个正常的项目(在调试和发布模式下都可以)?

【问题讨论】:

我要求将普通项目作为 .lib、测试项目和用于启动 .lib 项目的包装器。没有博客或文档可以做到这三点,所以我补充了其他领域的建议,但它不起作用。帖子说我应该做什么(链接器->包含库,C++->常规->在此处添加包含标头)显然是不够的。我已经设置了调试和发布模式。现在我想知道人们是否只是假装它有效;这太难了。顺便说一句,我将在此时获取一个有效的 .sln 文件,无需投诉或进一步提问。 我列出的每个资源和类似的问题都在 Stack Overflow 上,所以我没有考虑这是否适合该网站。另一方面,除非他们喜欢讨论项目配置,否则我不能说它在超级用户中会做得很好,所以我不知道迁移是否有用。我所知道的是,如果它确实得到了回答,有人会感激它:) 根据我的经验,严重缺乏有效的 gtest 示例。 【参考方案1】:

修复:

    在 SimpleCalc(调试)中,将 Project | Properties | General | Configuration type 更改为 Static Library。这就是为什么 Release 有效而 Debug 无效的原因。 对于 SimpleCalcWrapper,选择 Project | Add reference... 并添加 SimpleCalc。这就是 SimpleCalcWrapper 不起作用的原因。 对于 SimpleCalcTest(发行版),重置为默认值 Project | Properties | Linker | Advanced | Import Library 否则 SimpleCalcTest.exe 将无法编译。 对于 SimpleCalcTest,将 Project | Properties | C/C++ | Additional Include Directories 更改为 $(SolutionDir)\gtest\include;$(SolutionDir)\SimpleCalc;%(AdditionalIncludeDirectories)。这将使它们与项目相关。 对于 SimpleCalcTest,将 Project | Properties | Linker | Additional Library Directories 更改为 $(SolutionDir)\gtest;%(AdditionalLibraryDirectories) - 您不需要 SimpleCalc 目录,因为项目已添加到引用中。 对于 SimpleCalcWrapper,将 Project | Properties | C/C++ | Additional Include Directories 更改为 $(SolutionDir)\SimpleCalc;%(AdditionalIncludeDirectories) 对于 SimpleCalcWrapper,重置为默认 Project | Properties | Linker | Additional Library Directories - 您不需要 SimpleCalc 目录,因为项目已添加到引用中。

【讨论】:

太棒了。看起来我执行的步骤错误,可能是在调试/发布版本之间。我知道我尝试使用我认为我能够正确撤消的大杂烩答案来修复它。特别感谢 $(SolutionDir) 提示。

以上是关于Gtest 测试项目链接到其他可执行文件的主要内容,如果未能解决你的问题,请参考以下文章

gtest 三种事件机制

使用 otest 调试测试时,如何将我的可执行文件链接到我的测试包?

cmake 创建解决方案时未链接 64 位可执行文件

与opencv链接时内存泄漏

被测试的代码应该编译成 DLL 还是可执行文件?

链接 cxx 可执行文件时出现 Cmake 错误未定义引用