c++ - 如何使用 CMake 链接 .so 文件

标签 c++ cmake ubuntu-18.04

<分区>

我想基于一个 .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,我是否应该将所有这些文件包含在我的可执行文件中?

最佳答案

错误消息意味着您必须将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)

关于c++ - 如何使用 CMake 链接 .so 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65886495/

相关文章:

cmake - 如何在 CMake 的 execute_process 中传递列表变量?

android - Ubuntu 18.04 React Native 运行 Android javax.net.ssl.SSLException

c++ - 如何引用静态库中的Windows运行时类?

c++ - 按索引删除一堆元素?

c++ - 使用 Windows GDI 绘制一个点

makefile - 在 CMake 中获取 CMAKE_CURRENT_SOURCE_DIR 上面的目录

visual-studio-2010 - 使用带有 Xcode 和 Visual Studio 的 CMake 构建 x86 和 x64 平台

shell - linux 文件系统布局-partiton-fdisk

c++ - 安装多个版本时使用特定的 protobuf 版本

c++ - 如何动态确定libudev版本