编译共享库时传递CMake链接目录

时间:2017-06-22 14:05:03

标签: cmake

假设我的C项目具有以下结构(简化):

|- CMakeLists.txt   <- This is root CMake
|- lib
    |- <some source files>
    |- CMakeLists.txt   <- CMake file for building the library
|- demo
    |- <some source files>
    |- CMakeLists.txt   <- CMake for building demo apps
|- extra_lib
    |- <some source files>
    |- CMakeLists.txt   <- CMake for building supplementary library

现在,我想构建我的库(住在lib)作为共享库,供demo目录中的演示应用程序使用。

附加库,它不能成为我的库的一部分(它本质上是一些C ++外部库的包装)也可以编译为共享库,然后链接到我的库。

我有一个问题,包括附加库的依赖项。在CMakeLists.txt我已定义link_directories指向存储.so库的位置,然后target_link_libraries指向应链接的位置。最后我做了出口目标。

include_directories(${EXTERNAL_DIR}/include)
link_directories(${EXTERNAL_DIR}/lib)

add_library(extra_lib SHARED extra_lib.cpp)

target_link_libraries(extra_lib
  some_lib
)

export(TARGETS extra_lib FILE extra_lib.cmake)

关键是,当我尝试编译lib并将其与extra_lib相关联时,我收到错误some_lib未找到,我猜这意味着link_directories是本地extra_lib

现在,问题是如何让它与依赖项一起传播?我希望它的工作方式是添加extra_lib作为子目录,并作为我的lib的依赖项自动添加从extra_liblib链接过程的链接目录。

链接过程如下:

(某些外部图书馆) - &gt; extra_lib - &gt; lib - &gt;演示应用

1 个答案:

答案 0 :(得分:1)

首先,很少需要像include_directorieslink_directories这样的CMake docs状态。事实上,改为使用target_include_directoriestarget_link_libraries几乎总是更好。

其次,你的方法失败的原因是因为你需要让CMake知道some_lib的存在。你可以这样做:

add_library(some_lib SHARED IMPORTED)
set_target_properties(some_lib
    PROPERTIES
        IMPORTED_LOCATION ${EXTERNAL_DIR}/lib/libsome_lib.so)

然后,之后:

target_link_libraries(extra_lib some_lib)