如何使用 CMake 链接 .so 文件

Baz*_*iil 3 c++ cmake ubuntu-18.04

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

\n
cmake_minimum_required(VERSION 3.5)    \nset(CMAKE_CXX_STANDARD 11)      \nproject(test C CXX)\n\nadd_executable(${PROJECT_NAME} main.cpp)\n\ntarget_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_SOURCE_DIR}/lib)     \ntarget_link_libraries(test ${CMAKE_SOURCE_DIR}/libA.so ${CMAKE_SOURCE_DIR}/libB.so) \n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
main.cpp:(.text+0xf2d) : undefined reference to \xc2\xab pthread_create \xc2\xbb\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n

Tho*_*lik 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)
Run Code Online (Sandbox Code Playgroud)

您可以使用以下命令添加路径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)
Run Code Online (Sandbox Code Playgroud)