【问题标题】:cmake does not consider -pthreadcmake 不考虑 -pthread
【发布时间】: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'

我也读过

googletest: how to setup?

直接使用 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;
}

【问题讨论】:

标签: c++ cmake pthreads googletest


【解决方案1】:

在忙碌的几个小时之后,我成功地使用 KDevelop/CMake/gtest 编译了我的超级复杂的测试程序

#include "gtest-1.7.0/include/gtest/gtest.h"

TEST(blahTest, blah1) {
    EXPECT_EQ(1, 1);
}

int main (int argc, char** argv) {
    ::testing::InitGoogleTest(&argc, argv);

    return  RUN_ALL_TESTS();
}

可以完成任务的 CMakeLists.txt 文件是

# http://stackoverflow.com/questions/13513905/how-to-properly-setup-googletest-on-linux/13513907#13513907
# http://stackoverflow.com/questions/15193785/how-to-get-cmake-to-recognize-pthread-on-ubuntu
# http://stackoverflow.com/questions/21116622/undefined-reference-to-pthread-key-create-linker-error
# http://stackoverflow.com/questions/1620918/cmake-and-libpthread
# https://meekrosoft.wordpress.com/2009/10/04/testing-c-code-with-the-googletest-framework/
# http://stackoverflow.com/questions/30106608/googletest-cmake-and-make-tests-not-running
# http://stackoverflow.com/questions/13521618/c-project-organisation-with-gtest-cmake-and-doxygen
# http://www.kaizou.org/2014/11/gtest-cmake/
cmake_minimum_required(VERSION 2.8)
project(ThreadTest C CXX)
ADD_SUBDIRECTORY (gtest-1.7.0)
enable_testing()

#set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
find_package(GTest REQUIRED)
include_directories(${gtest_SOURCE_DIR}/include ${gtest_SOURCE_DIR})

if(NOT MSVC)
  set(PThreadLib -pthread)
endif()

add_executable(ThreadTest main_test.cpp) 
target_link_libraries(ThreadTest ${PThreadLib} ${GTEST_LIBRARIES})
#add_test(ThreadTest ThreadTest)

我想强调一些事情:一些有价值的链接和

project(ThreadTest C CXX) rather than project(ThreadTest)

和

set(PThreadLib -pthread) rather than set(PThreadLib pthread)

我想其余的可以管理。这可能是一个很好的起点。

【讨论】:

    【解决方案2】:

    我在自己的项目中集成了 Google 测试框架,这个 CMake 文件正在运行。

    # Google C++ Testing Framework
    # https://code.google.com/p/googletest/
    find_package(GTest REQUIRED)
    include_directories(${GTEST_INCLUDE_DIRS})
    
    if(WIN32)
        # GTest is static compiled by default
        set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
        set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
    endif()
    
    enable_testing()
    add_executable(ThreadTest main_test.cpp)
    target_link_libraries(ThreadTest ${GTEST_BOTH_LIBRARIES})
    

    CMake 警告“找不到线程”与错误有关: CMake failing to detect pthreads due to warnings

    【讨论】:

    • 嗯。我的系统一直在提示:make -j2 CMake Error at /usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:108(消息):找不到 GTest(缺少:GTEST_LIBRARY GTEST_MAIN_LIBRARY)(安装了 libgtest-dev)跨度>
    • 谢谢你的提示,我不知道,直到现在,我猜,它只是 gmock 的一部分。根据该消息来源,“但 gmock 不见了”。无论如何,我稍后会尝试。
    【解决方案3】:

    您需要做的就是与 pthread 链接:

    target_link_libraries(BUILD_ARTIFACT pthread)
    

    BUILD_ARTIFACT 可以是您的项目或库名称。您应该在定义工件后添加这一行。

    例如,如果您的构建工件是ThreadTest:

    add_executable(ThreadTest main_test.cpp)
    target_link_libraries(ThreadTest pthread)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-12
      • 2021-12-02
      • 2020-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-31
      相关资源
      最近更新 更多