cmake does not consider语言 - pthread
cmake does not consider -pthread
我正在尝试使用gmock/gtest对我的程序进行测试;Ubuntu Linux/;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:如何设置?
直接使用g++,一切都可以工作。所以,因为我使用KDevelop/CMake,我怀疑我的代码或CMake。
在我的CMakeLists.txt中我使用
add_definitions( -pthread -m64)
但是,我在Makefile中没有看到任何效果。我错过了一些从我的CMakeLists.txt,或CMake不考虑上面的行吗?
我CMakeLists.txtcmake_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应该在这种情况下工作?
后阅读如何强制cmake包含"-pthread"选项?我的问题看起来很像重复。然而,
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})
仍然给出警告'Could NOT find Threads'。我试着在Ubuntu软件中心搜索"线程",没有结果。之后,我安装了libghc-threads-dev。但是,当使用
时set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
find_package(Threads REQUIRED)
我一直收到'无法找到线程',作为错误。当简单的Makefile产生我所期望的结果时,我应该做些什么来满足find_package ?为什么我有这个问题?
PS: my main file:
#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;
}
经过几个小时的忙碌,我成功地编译了我的超级复杂的测试程序,使用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)
我想其余的可以处理。
我在我自己的项目中集成了谷歌测试框架,这个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警告"Could NOT find Threads"与一个bug有关:
你所需要做的就是链接到pthread:
target_link_libraries(BUILD_ARTIFACT pthread)
BUILD_ARTIFACT
可以是您的项目名,或者库名。您应该在定义工件之后添加这一行。
例如,如果构建工件是ThreadTest
:
add_executable(ThreadTest main_test.cpp)
target_link_libraries(ThreadTest pthread)
- 不同语言中相同代码的不同行为
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- r语言 - C++ 类型为"const std ::?
- 通用C++/Python 多语言的存在
- 为什么我的 EnumWindowProc 不能用 C 语言编译?
- 了解算法的性能差异(如果以不同的编程语言实现)
- Rextester 语言编译C++问题
- 如何将多种语言设置放在单个 .clang 格式文件中
- 不同语言中的模运算符差异
- 刚接触C++,难以理解语言的细微差别
- 为什么开发人员将C / C ++用于嵌入式系统,而不是像Python这样的高级语言与C相比?
- 我们可以用 C 语言嵌套 #define 和 #if 吗?
- 在 c++11 中为 pthread 设置调度参数
- 我的C++语言蛮力算法有问题
- 如何删除已输入的书以及如何使标题,语言和名称在上面放置空格不会出错?
- 如果不包含 pthread,为什么 GCC 的线程标准库实现会抛出异常?
- 为什么编程语言被编译为汇编程序而不是二进制?
- QDirIterator语言 - No hasNext not FilePath reaction
- "C.UTF-8" C++ Windows 上的语言环境?
- cmake does not consider语言 - pthread