在上一篇文章中,编写了一个简单的pthread的demo,但是在使用clion编译的时候,提示:
/home/allen/CLionProjects/multythreaddemo1/main.cpp:19: undefined reference to `pthread_create'
/home/allen/CLionProjects/multythreaddemo1/main.cpp:20: undefined reference to `pthread_create'
/home/allen/CLionProjects/multythreaddemo1/main.cpp:36: undefined reference to `pthread_join'
/home/allen/CLionProjects/multythreaddemo1/main.cpp:44: undefined reference to `pthread_join'
很明显,没有添加上pthread的库,虽然在头文件中include了他的库,但同时还需要在编译的时候指定。
首先使用gcc单独编译:
gcc main.cpp -otest -pthread
正常编译,同时程序正常执行,证明确实是clion在编译的时候没有添加上。
由于clion使用的是cmake,简单查了一下cmake添加编译参数,google搜索clion | cmake add flags ,其中几个答案够用了:
1
set(GCC_COVERAGE_COMPILE_FLAGS "-Wall -Wextra -Wconversion") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}" )
2
SET(GCC_COVERAGE_COMPILE_FLAGS "-fprofile-arcs -ftest-coverage")
SET(GCC_COVERAGE_LINK_FLAGS "-lgcov")
There are several ways to add them:
-
The easiest one (not clean, but easy and convenient, and works only for compile flags, C & C++ at once):
add_definitions(${GCC_COVERAGE_COMPILE_FLAGS})
-
Appending to corresponding CMake variables:
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}") SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${GCC_COVERAGE_LINK_FLAGS}")
-
Using target properties, cf. doc CMake compile flag target property and need to know the target name.
get_target_property(TEMP ${THE_TARGET} COMPILE_FLAGS) if(TEMP STREQUAL "TEMP-NOTFOUND") SET(TEMP "") # Set to empty string else() SET(TEMP "${TEMP} ") # A space to cleanly separate from existing content endif() # Append our values SET(TEMP "${TEMP}${GCC_COVERAGE_COMPILE_FLAGS}" ) set_target_properties(${THE_TARGET} PROPERTIES COMPILE_FLAGS ${TEMP} )
在clion的CMakeLists.txt中,添加
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")
或者添加
find_package(Threads REQUIRED) target_link_libraries(multythreaddemo1 Threads::Threads)
重新编译运行即可。