链接 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.a
和 libgtest_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 多线程可执行文件。为此,您传递选项
-pthread
到 g++
用于 link 程序。 (是的,-pthread
用于编译和
-pthread
再次 linking).
所以实际上你只需要做 1, 3, 5 和 6.
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++
.
生成了正确的命令行选项
恐怕这是一个基本问题,我可能已经在其他 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.a
和 libgtest_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 多线程可执行文件。为此,您传递选项
-pthread
到 g++
用于 link 程序。 (是的,-pthread
用于编译和
-pthread
再次 linking).
所以实际上你只需要做 1, 3, 5 和 6.
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++
.