【发布时间】:2015-10-13 08:33:28
【问题描述】:
我正在尝试使用 gmock/gtest 为我的程序制作一个测试平台; Linux/Ubuntu; KDevelop/CMake。从链接错误消息中,我得出结论,部分 gtest 包缺少 pthread 支持。
/home/projects/cpp/gmock/gtest/libgtest.a(gtest-all.cc.o): In function `testing::internal::ThreadLocal<testing::TestPartResultReporterInterface*>::~ThreadLocal()':
gtest-all.cc:(.text._ZN7testing8internal11ThreadLocalIPNS_31TestPartResultReporterInterfaceEED2Ev[_ZN7testing8internal11ThreadLocalIPNS_31TestPartResultReporterInterfaceEED5Ev]+0x16): undefined reference to `pthread_getspecific'
gtest-all.cc:(.text._ZN7testing8internal11ThreadLocalIPNS_31TestPartResultReporterInterfaceEED2Ev[_ZN7testing8internal11ThreadLocalIPNS_31TestPartResultReporterInterfaceEED5Ev]+0x2b): undefined reference to `pthread_key_delete'
我也读过
直接使用 g++,一切正常。因此,由于我使用的是 KDevelop/CMake,因此我怀疑我的代码或 CMake。
在我的 CMakeLists.txt 中我确实使用了
add_definitions( -pthread -m64)
但是,我在 Makefile 中看不到任何效果。 我是否遗漏了 CMakeLists.txt 中的某些内容,或者 CMake 没有考虑上面的行?
我的 CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
add_definitions( -Dpthread )
project(ThreadTest)
INCLUDE_DIRECTORIES(gmock/gtest/include)
set ( GTEST_LIBS libgtest.a )
link_directories( ~/projects/cpp/gmock/gtest)
add_executable(ThreadTest main_test.cpp)
target_link_libraries(ThreadTest ${GTEST_LIBS})
我是否误解了,add_definitions 应该在这种情况下工作?
看完之后 How do I force cmake to include "-pthread" option during compilation? 我的问题看起来真的很重复。不过,
cmake_minimum_required(VERSION 2.8)
add_definitions( -Dpthread )
project(ThreadTest)
INCLUDE_DIRECTORIES(gmock/gtest/include)
find_package( Threads )
set ( GTEST_LIBS libgtest.a )
link_directories( ~/projects/cpp/gmock/gtest)
add_executable(ThreadTest main_test.cpp)
target_link_libraries(ThreadTest ${GTEST_LIBS} ${CMAKE_THREAD_LIBS_INIT})
仍然给出警告“找不到线程”。我试图在 Ubuntu 软件中心搜索“线程”,但没有结果。之后,我安装了 libghc-threads-dev。但是,当使用
set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
find_package(Threads REQUIRED)
我不断收到“找不到线程”作为错误消息。我应该怎么做才能满足 find_package,当简单的 Makefile 产生我期望的结果时,为什么会出现这个问题?
PS:我的主文件:
#include "gmock/gtest/include/gtest/gtest.h"
TEST(blahTest, blah1) {
EXPECT_EQ(1, 1);
}
int main (int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);
int returnValue;
returnValue = RUN_ALL_TESTS();
return returnValue;
}
【问题讨论】:
-
对于 CMake 添加链接库(pthread)
标签: c++ cmake pthreads googletest