如何使用CMake链接.so文件

3

我希望重构一个基于 .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 文件无关。 - Kuba hasn't forgotten Monica
2个回答

5
错误信息表示你需要将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 编译没有错误,但启动应用程序时出现了段错误(core dumped)。所以我猜测这个问题已经解决了,但是又出现了一个新的问题。 - Bazziil

0

做到这一点的好方法是定义相应的目标,代表库。

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接