首页 > 解决方案 > 在 cmake 中需要具有依赖项的共享库

问题描述

我是 cmake 的新手,所以我无法弄清楚如何对以下内容进行建模:我的程序需要一个第三方库,我只能以头文件和*.so文件的形式访问该库。它还将许多依赖项作为*.so文件提供。如何确保所有内容都正确编译和链接,理想情况下以“正确”的 cmake 方式?

我试过这个

cmake_minimum_required (VERSION 3.8)
project ("Test")

add_executable (MyApp "MyApp.cpp")
link_directories("/path/to/lib")
target_include_directories(MyApp PUBLIC "/path/to/headers")

这编译但在链接阶段失败。

然后我尝试了

cmake_minimum_required (VERSION 3.8)
project ("Test")
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
add_executable (MyApp "MyApp.cpp")
find_package(Library REQUIRED)
target_link_libraries(MyApp PUBLIC Library::Library)

cmake/FindLibrary.cmake遵循https://pabloariasal.github.io/2018/02/19/its-time-to-do-cmake-right/(截断):

...
if(Library_FOUND AND NOT TARGET Library::Library)
    add_library(Library::Library SHARED IMPORTED)
    set_target_properties(Library::Library PROPERTIES
        INTERFACE_INCLUDE_DIRECTORIES "${Library_INCLUDE_DIR}"
    )
    set_target_properties(Library::Library PROPERTIES
        IMPORTED_LOCATION "/path/to/library.so"
    )
endif()

*.so这会编译并链接,但在运行时找不到所需的其他文件。我想我还需要以某种方式将它们添加为库,尽管我不希望它们以FindLibrary.cmake. 我该如何正确地做到这一点?

标签: c++cmake

解决方案


您可以使用IMPORTED库:

add_library(externalLib SHARED IMPORTED GLOBAL)
set_property(TARGET externalLib PROPERTY IMPORTED_LOCATION "/path/to/lib.so")
target_include_directories(externalLib INTERFACE "/path/to/headers")
target_link_directories(externalLib INTERFACE /path/to/libs)
target_link_libraries(externalLib INTERFACE -ldep1 -ldep2)

然后你可以依赖它:

target_link_libraries(MyApp PRIVATE externalLib)

推荐阅读