链接 GoogleTest 和 CodeBlocks

Linking GoogleTest and CodeBlocks

恐怕这是一个基本问题,我可能已经在其他 IDE 中找到了答案,但在 CodeBlocks 中找不到答案 =(

我尝试使用 GoogleTest。我下载了项目,用 cmake -G "CodeBlocks - Unix Makefiles" 构建了它(我在 Ubuntu)

这给了我在 /usr/lib

中传输的 libgtest.a 和 libgtest_main.a 文件

而且我认为我缺少的是最后一步:链接 GoogleTest 和 CodeBlocks。一些教程告诉我要添加“-lgtest”链接器选项,我尝试了很多但都是一样的:当我尝试编译我的#include "gtest/gtest.h" returns 时出现致命错误 "No such file or directory"。

你能帮帮我可怜的灵魂吗?

不要将您自己构建的文件放在 /usr/... 下 除非你把它们放在 /usr/local/... 下。其余 /usr/... 由您的 Linux 发行版保留,应该由您的包管理器专门填充。如果你在包管理器的背后乱搞, 您冒着损坏包裹并遭受任何痛苦的风险。

首先从 /usr/lib 中删除 libgtest.alibgtest_main.a

您已经下载 googletest 并首先将其构建在某个目录中 运行ning CMake 在该目录中然后 运行ning make.

完成后,在您 运行 make、运行:

所在的同一目录中
sudo make install

这将在 /usr/local/lib 中安装所有 gmock / gtest 库。 它将在 /usr/local/include/gmock 中安装 gmock 头文件并安装 /usr/local/include/gtest 中的 gtest 个头文件。去那里看看。

/usr/local/...属于你在那里做什么都不会干涉 与包管理器。

接下来,要在您的单元测试程序中使用 googletest,您可能需要执行以下操作 6 件事:

1: #include <gtest/gtest.h> 在您的源文件中适用。 (笔记: <gtest/gtest.h>,并没有什么不同)。

2:告诉编译器什么目录包含gtest/gtest.h,除非 它是编译器的默认搜索目录之一。要做到这一点,你会 将选项 -I/usr/local/include 传递给 g++ 以编译源文件。但你不需要 这样做,因为 /usr/local/include 编译器的默认搜索之一 目录。

3: 告诉 linker 你想要 link libgtest.a。要做到这一点,你 将选项 -lgtest 传递给 g++ 用于 link 程序。

4: 告诉 linker 哪个目录包含 libgest.a,除非 它是 linker 的默认搜索目录之一。要做到这一点,你会 将选项 -L/usr/local/lib 传递给 g++ 以 link 编辑程序。但你不需要 这样做,因为 /usr/local/lib link 用户的默认搜索之一 目录。

5: 告诉编译器生成线程安全的代码。 (为什么?因为默认情况下, libgest 是一个多线程库。如果你可以单线程构建它 想要,但我假设你没有。)为此,你传递选项 -pthread g++ 用于编译源文件。

6: 告诉 linker link 多线程可执行文件。为此,您传递选项 -pthreadg++ 用于 link 程序。 (是的,-pthread 用于编译和 -pthread 再次 linking).

所以实际上你只需要做 1, 3, 56.

1 不需要进一步解释。其余的需要您设置 Code::Blocks 项目 构建选项 正确,以便它们生成正确的 g++ ... 命令用于编译和 linking.

看起来你已经 3 正确了:在 Build options... -> 链接器设置 -> 其他 linker 选项,添加行:-lgtest

对于5,在构建选项中... -> 编译器设置 -> 其他编译器选项,添加行:-pthread

对于 6,在 Build options... -> Linker settings -> 其他 linker 选项,添加另一行:-pthread, 在 -lgtest.

之后

就是这样。保存这些设置后,您就可以构建项目了。如果有错误,你可以查看 Build log 选项卡下的构建日志(不是 Build messages 选项卡)以准确查看 g++ ... 命令 已执行编译和 linking,如果您的设置为 g++.

生成了正确的命令行选项