【发布时间】:2021-05-07 18:39:01
【问题描述】:
我是 cmake 新手,我正在尝试创建一个 CMakeLists.txt 来编译我的测试文件。
我有 3 个文件:calc.cpp、calc.hpp 和 calc_test.cpp,我使用以下命令编译我的测试:
g++ -o calc_test calc_test.cpp calc.cpp -lgtest -lpthread
它会生成一个二进制文件 (calc_test),我执行该文件来运行我的测试。
这是我的calc.hpp:
#ifndef CALC_HPP_
#define CALC_HPP_
int add(int op1, int op2);
int sub(int op1, int op2);
#endif
我的calc.cpp:
#include "calc.hpp"
int add(int op1, int op2) {
return op1 + op2;
}
int sub(int op1, int op2) {
return op1 - op2;
}
还有我的calc_test.cpp:
#include <gtest/gtest.h>
#include "calc.hpp"
TEST(CalcTest, Add) {
ASSERT_EQ(2, add(1, 1));
ASSERT_EQ(5, add(3, 2));
ASSERT_EQ(10, add(7, 3));
}
TEST(CalcTest, Sub) {
ASSERT_EQ(3, sub(5, 2));
ASSERT_EQ(-10, sub(5, 15));
}
int main(int argc, char **argv) {
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
现在我创建了一个 CMakeLists.txt 文件来编译我的测试文件并成功生成 Makefile,但是当我执行 cmake --build . 时它会抛出 undefined reference 错误。
这是我CMakeLists.txt的内容:
cmake_minimum_required(VERSION 3.10)
project(Google_Test)
add_library(TestModlue calc.cpp)
target_link_libraries(TestModlue -lgtest -lpthread)
add_executable(calc_test calc_test.cpp)
我做错了什么?
【问题讨论】:
-
您可能需要将您的
calc_test应用程序与 googleTest 链接,而不是您的库。 -
我该怎么做?正如我所说,我是 cmake 的新手。 @AlexeyLarionov
-
最好的方法是从你的主项目中创建一个库。然后,您可以将此库链接到主可执行文件或 Google 测试二进制文件,因为它们都是单独的可执行文件,但需要共享您的主代码。我有一个示例项目,但我找不到它。 :(
-
谢谢,我会分享我的文件。 @Devolus
-
列出没有
-l的库名称,即target_link_libraries(TestModlue gtest pthread)此外,您将gtest链接到您的lib,但既不将该lib 也不将gtest 链接到可执行文件。由于calc_test.cpp我们使用gtest 文件,因此您应该将lib 链接到实际使用gtest的目标,而不是其他目标。target_link_libraries(calc_test gtest TestModlue pthread)似乎是target_link_libraries命令的正确版本。 (定位在add_executable之后)
标签: c++ cmake googletest