使用CMake编译项目时出现pthread未定义引用错误
项目编译报错:GLIBC版本依赖不兼容及pthread链接问题
项目结构
-project |-CMakeLists.txt (后续称第一个CMakeLists) |-build |-some files here |-src |-main.cpp |-my_lib.h |-my_lib.cpp |-CMakeLists.txt (后续称第二个CMakeLists) |-lib |-third_party_lib.so |-dep |-third_party_lib |-few .h files here |-CMakeLists.txt (后续称第三个CMakeLists)
编译错误
进入build目录执行cmake ..和cmake --build .后,出现以下链接错误:
/usr/bin/ld: ../lib/third_party_lib.so: undefined reference to `pthread_key_create@GLIBC_2.34' /usr/bin/ld: ../lib/third_party_lib.so: undefined reference to `pthread_setspecific@GLIBC_2.34' /usr/bin/ld: ../lib/third_party_lib.so: undefined reference to `__libc_single_threaded@GLIBC_2.32' /usr/bin/ld: ../lib/third_party_lib.so: undefined reference to `pthread_mutex_trylock@GLIBC_2.34' /usr/bin/ld: ../lib/third_party_lib.so: undefined reference to `pthread_getspecific@GLIBC_2.34' /usr/bin/ld: ../lib/third_party_lib.so: undefined reference to `std::__throw_bad_array_new_length()@GLIBCXX_3.4.29' /usr/bin/ld: ../lib/third_party_lib.so: undefined reference to `lstat@GLIBC_2.33' /usr/bin/ld: ../lib/third_party_lib.so: undefined reference to `pthread_once@GLIBC_2.34' /usr/bin/ld: ../lib/third_party_lib.so: undefined reference to `pthread_cond_clockwait@GLIBC_2.34'
现有CMake配置
第一个CMakeLists(项目根目录)
cmake_minimum_required(VERSION 3.13) project(reader LANGUAGES CXX) include(GNUInstallDirs) include (CTest) find_package(PkgConfig REQUIRED) add_subdirectory(dep) add_executable("${PROJECT_NAME}") add_subdirectory(src) install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION ${CMAKE_INSTALL_FULL_BINDIR})
第二个CMakeLists(src目录)
add_library("core_${PROJECT_NAME}") target_include_directories("core_${PROJECT_NAME}" PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) add_library(third_party_lib SHARED IMPORTED) set_property(TARGET third_party_lib PROPERTY IMPORTED_LOCATION "${CMAKE_SOURCE_DIR}/lib/third_party_lib.so") target_include_directories("core_${PROJECT_NAME}" PUBLIC ${CMAKE_SOURCE_DIR}/dep/third_party_lib) target_sources("core_${PROJECT_NAME}" PRIVATE my_lib.cpp ) target_compile_features("core_${PROJECT_NAME}" PUBLIC cxx_std_17) target_link_libraries("core_${PROJECT_NAME}" PUBLIC stdc++fs ) target_sources("${PROJECT_NAME}" PRIVATE main.cpp) target_link_libraries("${PROJECT_NAME}" PRIVATE "core_${PROJECT_NAME}" third_party_lib) set(THREADS_PREFER_PTHREAD_FLAG ON) find_package(Threads REQUIRED) target_link_libraries("${PROJECT_NAME}" PRIVATE Threads::Threads) target_compile_features("${PROJECT_NAME}" PRIVATE cxx_std_17) target_compile_definitions("${PROJECT_NAME}" PRIVATE VERSION="${PROJECT_VERSION}" )
第三个CMakeLists(dep目录)
set(SAVED_BUILD_DOCUMENTATION ${BUILD_DOCUMENTATION}) set(BUILD_DOCUMENTATION OFF) set(SAVED_BUILD_TESTING BUILD_TESTING) set(BUILD_TESTING OFF) set(BUILD_DOCUMENTATION ${SAVED_BUILD_DOCUMENTATION}) set(BUILD_TESTING ${SAVED_BUILD_TESTING})
问题
我已经尝试在第二个CMakeLists中链接Threads库,但错误依然存在,请问还有什么解决办法?
内容的提问来源于stack exchange,提问作者Dmitry
相关产品推荐
相关产品推荐

