【问题标题】:CMake project linking a static library链接静态库的 CMake 项目
【发布时间】:2018-06-15 17:59:47
【问题描述】:

我目前正在尝试在我的 cmake 项目中包含一个静态库。当我构建项目时,我收到如下错误:

[ 50%] Building CXX object src/CMakeFiles/MainApp.dir/main.cpp.o
[100%] Linking CXX executable MainApp
../../lib/librplidar_sdk.a(thread.o): In function `rp::hal::Thread::create(unsigned long (*)(void*), void*)':
thread.cpp:(.text+0x20): undefined reference to `pthread_create'
/../lib/librplidar_sdk.a(thread.o): In function `rp::hal::Thread::terminate()':
thread.cpp:(.text+0x48): undefined reference to `pthread_cancel'

CMakeLists.txt 看起来像这样(RPlidar beeing 静态库):

##################################################################
#                          RPLidar SDK                           #
##################################################################
add_library(RPlidar STATIC IMPORTED)
set_property(TARGET RPlidar PROPERTY IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/lib/librplidar_sdk.a)
set_property(TARGET RPlidar APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES
    $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include/rplidar>
)

##################################################################
#                         Main Executable                        #
##################################################################
add_executable(MainApp main.cpp)
target_link_libraries(MainApp PRIVATE RPlidar)

我发现当链接器选项 (-l) 放在要编译的文件名的前面而不是后面时,就会出现这些错误。但我不知道如何在我的 cmake 配置中解决这个问题。

【问题讨论】:

    标签: c++ gcc cmake static-libraries


    【解决方案1】:

    你要链接pthread:

    target_link_libraries(MainApp PRIVATE pthread RPlidar)
    

    【讨论】:

    • 更好的是:find_package(Threads REQUIRED),然后链接到Threads::Threads
    • 感谢您的快速响应。我现在实际上使用了 INTERFACE_LINK_LIBRARIES,所以我不必每次使用这个目标时都指定 Threads::Threads。
    猜你喜欢
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    • 2020-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 2020-08-23
    相关资源
    最近更新 更多