链接 gtest 项目时出错
Error when linking gtest project
最近我开始学习单元测试,我想用gtest测试我的程序。我按照这个顺序安装所有:
$ git clone https://github.com/google/googletest
$ cd googletest
$ cmake -DBUILD_SHARED_LIBS=ON .
$ make
$ cd googlemock
$ sudo cp ./libgmock_main.so ./gtest/libgtest.so gtest/libgtest_main.so ./libgmock.so /usr/lib/
$ sudo ldconfig
现在写代码:
#include "gtest/gtest.h"
class Add
{
private:
int element;
public:
Add():element(0){}
~Add(){}
void setElement(int e){ element = e; }
int getElement() { return element; }
int adder(int e) { return element += e; }
};
class AddTest : public ::testing::Test
{
protected:
int abc(int a){
return a;
}
virtual void SetUp(){
add1.setElement(1);
add2.setElement(20);
}
virtual void TearDown(){}
Add add1;
Add add2;
};
TEST_F(AddTest, getTest)
{
EXPECT_EQ(1, add1.getElement());
EXPECT_EQ(20, add2.getElement());
}
int main(int argc, char **argv)
{
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
结束时我 运行 测试我得到这个错误:
CMakeFiles/mock2.dir/main.cpp.o: 在函数 AddTest_getTest_Test::TestBody()':
/home/artem/CLionProjects/mock2/main.cpp:33: undefined reference to
testing::Message::Message()'
/home/artem/CLionProjects/mock2/main.cpp:33: 对 testing::internal::AssertHelper::AssertHelper(testing::TestPartResult::Type, char const*, int, char const*)'
/home/artem/CLionProjects/mock2/main.cpp:33: undefined reference to
testing::internal::AssertHelper::operator=(testing::Message const&) const 的未定义引用
/home/artem/CLionProjects/mock2/main.cpp:33: 对 testing::internal::AssertHelper::~AssertHelper()'
/home/artem/CLionProjects/mock2/main.cpp:34: undefined reference to
testing::Message::Message()' 的未定义引用
/home/artem/CLionProjects/mock2/main.cpp:34: 对 testing::internal::AssertHelper::AssertHelper(testing::TestPartResult::Type, char const*, int, char const*)'
/home/artem/CLionProjects/mock2/main.cpp:34: undefined reference to
testing::internal::AssertHelper::operator=(testing::Message const&) const 的未定义引用
/home/artem/CLionProjects/mock2/main.cpp:34: 对 testing::internal::AssertHelper::~AssertHelper()'
/home/artem/CLionProjects/mock2/main.cpp:33: undefined reference to
testing::internal::AssertHelper::~AssertHelper()' 的未定义引用
/home/artem/CLionProjects/mock2/main.cpp:34:对 testing::internal::AssertHelper::~AssertHelper()'
CMakeFiles/mock2.dir/main.cpp.o: In function
main' 的未定义引用:
/home/artem/CLionProjects/mock2/main.cpp:39: 对 testing::InitGoogleTest(int*, char**)'
CMakeFiles/mock2.dir/main.cpp.o: In function
__static_initialization_and_destruction_0(int, int)' 的未定义引用:
/home/artem/CLionProjects/mock2/main.cpp:31: 对 testing::internal::MakeAndRegisterTestInfo(char const*, char const*, char const*, char const*, testing::internal::CodeLocation, void const*, void (*)(), void (*)(), testing::internal::TestFactoryBase*)'
CMakeFiles/mock2.dir/main.cpp.o: In function
RUN_ALL_TESTS()' 的未定义引用:
/usr/local/include/gtest/gtest.h:2235: 对 testing::UnitTest::GetInstance()'
/usr/local/include/gtest/gtest.h:2235: undefined reference to
testing::UnitTest::运行() 的未定义引用
CMakeFiles/mock2.dir/main.cpp.o: 在函数 AddTest::AddTest()':
/home/artem/CLionProjects/mock2/main.cpp:15: undefined reference to
testing::Test::Test()'
CMakeFiles/mock2.dir/main.cpp.o: 在函数 AddTest::~AddTest()':
/home/artem/CLionProjects/mock2/main.cpp:15: undefined reference to
testing::Test::~Test()'
CMakeFiles/mock2.dir/main.cpp.o: 在函数 testing::internal::scoped_ptr<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::reset(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*)':
/usr/local/include/gtest/internal/gtest-port.h:1172: undefined reference to
testing::internal::IsTrue(bool)'
CMakeFiles/mock2.dir/main.cpp.o: 在函数 testing::internal::scoped_ptr<std::__cxx11::basic_stringstream<char, std::char_traits<char>, std::allocator<char> > >::reset(std::__cxx11::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >*)':
/usr/local/include/gtest/internal/gtest-port.h:1172: undefined reference to
testing::internal::IsTrue(bool)'
CMakeFiles/mock2.dir/main.cpp.o: 在函数 testing::AssertionResult testing::internal::CmpHelperEQ<int, int>(char const*, char const*, int const&, int const&)':
/usr/local/include/gtest/gtest.h:1394: undefined reference to
testing::AssertionSuccess() 中
CMakeFiles/mock2.dir/main.cpp.o: 在函数 testing::AssertionResult testing::internal::CmpHelperEQFailure<int, int>(char const*, char const*, int const&, int const&)':
/usr/local/include/gtest/gtest.h:1384: undefined reference to
testing::internal::EqFailure(char const*, char const*, std::__cxx11::basic_string, std::allocator > const&, std::__cxx11::basic_string, std::allocator > const&, bool)'
CMakeFiles/mock2.dir/main.cpp.o:(.rodata._ZTI7AddTest[_ZTI7AddTest]+0x10): 未定义对“testing::Test 的类型信息”的引用
collect2:错误:ld 返回 1 退出状态
CMakeFiles/mock2.dir/build.make:94:目标 'mock2' 的配方失败
make[3]: * [mock2] 错误 1
CMakeFiles/Makefile2:67: 目标 'CMakeFiles/mock2.dir/all' 的配方失败
make[2]: [CMakeFiles/mock2.dir/all] 错误2
CMakeFiles/Makefile2:79: 目标 'CMakeFiles/mock2.dir/rule' 的配方失败
make[1]: [CMakeFiles/mock2.dir/rule] 错误2
Makefile:118:目标 'mock2' 的配方失败
make: * [mock2] 错误 2
但是当使用命令时
g++ main.cpp -o test -lgtest -lpthread
一切都很好。我如何修复它并且 运行 它不在命令行中?
如果您使用的是 CLion,那么您可能有一个 CMakeLists.txt 文件,您应该将 link 的规则添加到库中。为此,请将以下行添加到您的 CMakeLists.txt
enable_testing()
find_package(GTest REQUIRED) # Find the google testing framework on your system
include_directories(${GTEST_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} ${GTEST_LIBRARIES}) # Replace ${PROJECT_NAME} with your target name
有关详细信息,请转到 here。
最近我开始学习单元测试,我想用gtest测试我的程序。我按照这个顺序安装所有:
$ git clone https://github.com/google/googletest
$ cd googletest
$ cmake -DBUILD_SHARED_LIBS=ON .
$ make
$ cd googlemock
$ sudo cp ./libgmock_main.so ./gtest/libgtest.so gtest/libgtest_main.so ./libgmock.so /usr/lib/
$ sudo ldconfig
现在写代码:
#include "gtest/gtest.h"
class Add
{
private:
int element;
public:
Add():element(0){}
~Add(){}
void setElement(int e){ element = e; }
int getElement() { return element; }
int adder(int e) { return element += e; }
};
class AddTest : public ::testing::Test
{
protected:
int abc(int a){
return a;
}
virtual void SetUp(){
add1.setElement(1);
add2.setElement(20);
}
virtual void TearDown(){}
Add add1;
Add add2;
};
TEST_F(AddTest, getTest)
{
EXPECT_EQ(1, add1.getElement());
EXPECT_EQ(20, add2.getElement());
}
int main(int argc, char **argv)
{
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
结束时我 运行 测试我得到这个错误:
CMakeFiles/mock2.dir/main.cpp.o: 在函数 AddTest_getTest_Test::TestBody()':
/home/artem/CLionProjects/mock2/main.cpp:33: undefined reference to
testing::Message::Message()'
/home/artem/CLionProjects/mock2/main.cpp:33: 对 testing::internal::AssertHelper::AssertHelper(testing::TestPartResult::Type, char const*, int, char const*)'
/home/artem/CLionProjects/mock2/main.cpp:33: undefined reference to
testing::internal::AssertHelper::operator=(testing::Message const&) const 的未定义引用
/home/artem/CLionProjects/mock2/main.cpp:33: 对 testing::internal::AssertHelper::~AssertHelper()'
/home/artem/CLionProjects/mock2/main.cpp:34: undefined reference to
testing::Message::Message()' 的未定义引用
/home/artem/CLionProjects/mock2/main.cpp:34: 对 testing::internal::AssertHelper::AssertHelper(testing::TestPartResult::Type, char const*, int, char const*)'
/home/artem/CLionProjects/mock2/main.cpp:34: undefined reference to
testing::internal::AssertHelper::operator=(testing::Message const&) const 的未定义引用
/home/artem/CLionProjects/mock2/main.cpp:34: 对 testing::internal::AssertHelper::~AssertHelper()'
/home/artem/CLionProjects/mock2/main.cpp:33: undefined reference to
testing::internal::AssertHelper::~AssertHelper()' 的未定义引用
/home/artem/CLionProjects/mock2/main.cpp:34:对 testing::internal::AssertHelper::~AssertHelper()'
CMakeFiles/mock2.dir/main.cpp.o: In function
main' 的未定义引用:
/home/artem/CLionProjects/mock2/main.cpp:39: 对 testing::InitGoogleTest(int*, char**)'
CMakeFiles/mock2.dir/main.cpp.o: In function
__static_initialization_and_destruction_0(int, int)' 的未定义引用:
/home/artem/CLionProjects/mock2/main.cpp:31: 对 testing::internal::MakeAndRegisterTestInfo(char const*, char const*, char const*, char const*, testing::internal::CodeLocation, void const*, void (*)(), void (*)(), testing::internal::TestFactoryBase*)'
CMakeFiles/mock2.dir/main.cpp.o: In function
RUN_ALL_TESTS()' 的未定义引用:
/usr/local/include/gtest/gtest.h:2235: 对 testing::UnitTest::GetInstance()'
/usr/local/include/gtest/gtest.h:2235: undefined reference to
testing::UnitTest::运行() 的未定义引用
CMakeFiles/mock2.dir/main.cpp.o: 在函数 AddTest::AddTest()':
/home/artem/CLionProjects/mock2/main.cpp:15: undefined reference to
testing::Test::Test()'
CMakeFiles/mock2.dir/main.cpp.o: 在函数 AddTest::~AddTest()':
/home/artem/CLionProjects/mock2/main.cpp:15: undefined reference to
testing::Test::~Test()'
CMakeFiles/mock2.dir/main.cpp.o: 在函数 testing::internal::scoped_ptr<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::reset(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*)':
/usr/local/include/gtest/internal/gtest-port.h:1172: undefined reference to
testing::internal::IsTrue(bool)'
CMakeFiles/mock2.dir/main.cpp.o: 在函数 testing::internal::scoped_ptr<std::__cxx11::basic_stringstream<char, std::char_traits<char>, std::allocator<char> > >::reset(std::__cxx11::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >*)':
/usr/local/include/gtest/internal/gtest-port.h:1172: undefined reference to
testing::internal::IsTrue(bool)'
CMakeFiles/mock2.dir/main.cpp.o: 在函数 testing::AssertionResult testing::internal::CmpHelperEQ<int, int>(char const*, char const*, int const&, int const&)':
/usr/local/include/gtest/gtest.h:1394: undefined reference to
testing::AssertionSuccess() 中
CMakeFiles/mock2.dir/main.cpp.o: 在函数 testing::AssertionResult testing::internal::CmpHelperEQFailure<int, int>(char const*, char const*, int const&, int const&)':
/usr/local/include/gtest/gtest.h:1384: undefined reference to
testing::internal::EqFailure(char const*, char const*, std::__cxx11::basic_string, std::allocator > const&, std::__cxx11::basic_string, std::allocator > const&, bool)'
CMakeFiles/mock2.dir/main.cpp.o:(.rodata._ZTI7AddTest[_ZTI7AddTest]+0x10): 未定义对“testing::Test 的类型信息”的引用
collect2:错误:ld 返回 1 退出状态
CMakeFiles/mock2.dir/build.make:94:目标 'mock2' 的配方失败
make[3]: * [mock2] 错误 1
CMakeFiles/Makefile2:67: 目标 'CMakeFiles/mock2.dir/all' 的配方失败
make[2]: [CMakeFiles/mock2.dir/all] 错误2
CMakeFiles/Makefile2:79: 目标 'CMakeFiles/mock2.dir/rule' 的配方失败
make[1]: [CMakeFiles/mock2.dir/rule] 错误2
Makefile:118:目标 'mock2' 的配方失败
make: * [mock2] 错误 2
但是当使用命令时
g++ main.cpp -o test -lgtest -lpthread
一切都很好。我如何修复它并且 运行 它不在命令行中?
如果您使用的是 CLion,那么您可能有一个 CMakeLists.txt 文件,您应该将 link 的规则添加到库中。为此,请将以下行添加到您的 CMakeLists.txt
enable_testing()
find_package(GTest REQUIRED) # Find the google testing framework on your system
include_directories(${GTEST_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} ${GTEST_LIBRARIES}) # Replace ${PROJECT_NAME} with your target name
有关详细信息,请转到 here。