假设我的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_lib
到lib
链接过程的链接目录。
链接过程如下:
(某些外部图书馆) - &gt; extra_lib - &gt; lib - &gt;演示应用
答案 0 :(得分:1)
首先,很少需要像include_directories
和link_directories
这样的CMake docs状态。事实上,改为使用target_include_directories
和target_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)