簡體   English   中英

需要在 cmake 中具有依賴項的共享庫

[英]Require shared library with dependencies in 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導出。 我該如何正確地做到這一點?

您可以使用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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM