【问题标题】:how to link .so files with CMake [duplicate]如何将.so文件与CMake链接[重复]
【发布时间】:2021-04-29 08:38:52
【问题描述】:

我想重建一个基于 .cpp、一个 .h 和多个 .so 文件的简单应用程序。从我所见,我的 CMakeLists.txt 应该是这样的:

cmake_minimum_required(VERSION 3.5)    
set(CMAKE_CXX_STANDARD 11)      
project(test C CXX)

add_executable(${PROJECT_NAME} main.cpp)

target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_SOURCE_DIR}/lib)     
target_link_libraries(test ${CMAKE_SOURCE_DIR}/libA.so ${CMAKE_SOURCE_DIR}/libB.so) 

所有文件都在同一个文件夹中。我之前将我的 .cpp 与我的 .h 文件正确链接。 cmake . 没有给我任何错误,但是在使用 make 之后我得到了:

main.cpp:(.text+0xf2d) : undefined reference to « pthread_create »

这是一个不属于我的 .h 文件的函数,所以它应该在 .so 文件中。我不知道问题是来自链接还是文件 .so 本身。

我也有同名的文件,例如 libA.so、libA.so.0 或 libA.so.0.2,我应该在我的可执行文件中包含所有这些文件吗?

【问题讨论】:

  • 需要连接pthreads,将pthread库添加到target_link_libraries。它与您的其他 .so 文件无关(很可能)。

标签: c++ cmake ubuntu-18.04


【解决方案1】:

错误消息意味着您必须将pthread 添加到链接库列表中。在target_link_libraries 中,您只列出没有路径、lib 前缀和文件扩展名的库名称:

cmake_minimum_required(VERSION 3.5)    
set(CMAKE_CXX_STANDARD 11)      
project(test C CXX)

find_package(Threads REQUIRED)

add_executable(${PROJECT_NAME} main.cpp)

target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_SOURCE_DIR}/lib)     
target_link_libraries(test A B Threads::Threads)

您可以使用target_link_directories添加路径:

cmake_minimum_required(VERSION 3.5)    
set(CMAKE_CXX_STANDARD 11)      
project(test C CXX)

find_package(ThreadsREQUIRED)

add_executable(${PROJECT_NAME} main.cpp)

target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_SOURCE_DIR}/lib)     
target_link_directories(test PRIVATE ${CMAKE_SOURCE_DIR})
target_link_libraries(test PRIVATE A B Threads::Threads)

【讨论】:

  • 感谢@ThomasSablik,make 编译没有错误,但启动应用程序给我分段错误(核心转储)。所以我想这个问题已经解决了,这是一个新问题。
【解决方案2】:

这样做的好方法是定义代表库的相应目标。

add_library(externalLibA SHARED IMPORTED)
set_target_properties(externalLibA 
    PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/libA.so)
target_include_directories(externalLibA
    INTERFACE ${CMAKE_SOURCE_DIR}/lib)

然后将此目标添加为目标的依赖项。

add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME} PUBLIC externalLibA)

【讨论】:

    猜你喜欢
    • 2020-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    • 2012-09-01
    • 2013-02-17
    • 1970-01-01
    相关资源
    最近更新 更多