如何导出 cmake 库所依赖的库,这样依赖该库的可执行文件就不必手动依赖该库的依赖项?
说的有点啰嗦,举个例子:
dummy (application) ----> 依赖于 liba
liba ----> 依赖于 libpng
编译 dummy 产生错误:
-- Found LIBPNG
-- Found LIBA
-- Configuring done
-- Generating done
-- Build files have been written to: /home/doug/projects/dummy/build
Linking C executable dummy
../deps/liba/build/liba.a(a.c.o): In function `a_dummy':
/home/doug/projects/dummy/deps/liba/src/a.c:6: undefined reference to `png_sig_cmp'
collect2: ld returned 1 exit status
make[2]: *** [dummy] Error 1
make[1]: *** [CMakeFiles/dummy.dir/all] Error 2
make: *** [all] Error 2
我可以通过将此添加到 CMakeLists.txt for dummy 来解决这个问题:
TARGET_LINK_LIBRARIES(虚拟 png)
然而,dummy 并不知道 liba 是如何实现其 api 的。在某些时候,它可能会变成 libjpg 或其他东西,这将破坏虚拟应用程序。
从 cmake 邮件列表获得一些帮助后,我被引导到这个用于导出内容的示例: http://www.cmake.org/Wiki/CMake/Tutorials/How_to_create_a_ProjectConfig.cmake_file
但是,按照这种方法让我停留在这一行:
导出(目标 ${LIBPNG_LIBRARY} 文件“${PROJECT_BINARY_DIR}/ALibraryDepends.cmake”)
显然我在这里遗漏了一些东西;这个“导出”命令看起来像是设计用于将子项目导出到高级别; IE。 liba 中的嵌套项目。
然而,这不是这里的问题。
在配置 liba(或任何 cmake 库)时,我总是会生成一个不属于该项目的依赖项列表。
当我使用 find_package() 来解析 liba 时,如何导出它们以便它们作为 LIBA_LIBRARY 的一部分出现?
使用静态库不是一个选项(链接到 opengl 的东西的静态库?不。)
最佳答案
鉴于您对 arrowdodger 关于恐惧的回答的评论 安装一些东西会弄乱你的系统我选择给 以答案形式出现的概念性评论,因为它 长度。
通过 find_package 链接 cmake 项目,查找 *Config.cmake 和 *-config.cmake 文件。
项目 A 的 CMakeLists.txt:
#CMakeLists.txt
project(A)
install(FILES
${CMAKE_CURRENT_SOURCE_DIR}/AConfig.cmake share/A/cmake
)
#AConfig.cmake
message("Yepp, you've found me.")
$ mkdir build
$ cd build
$ cmake -DCMAKE_INSTALL_PREFIX=/tmp/test-install ..
$ make install
项目 B 的 CMakeLists.txt:
project(B)
find_package(A)
然后
$ mkdir build
$ cd build
$ cmake -DCMAKE_INSTALL_PREFIX=/tmp/test-install ..
$ make install
结果
...
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
Yepp, you've found me.
B 找到了 A,因为它安装了 AConfig.cmake 到一个位置 cmake 会在哪里找到它 'share/A/cmake' 并且给出相同的 CMAKE_INSTALL_PREFIX 的值。
现在就是这样。让我们想想你能做什么 AConfig.cmake:AFAIK 你想要的一切。但最常见的 任务是通过 include() 提取关于 A 的目标的信息, 为第 3 方做一些额外的 find_package 调用 打包(HINT HINT)并创建变量
A_LIBRARIES
A_INCLUDE_DIRS
您要包含的是一个由以下人员创建的文件
install(EXPORT A-targets
DESTINATION share/A/cmake
)
在 A 的 CMakeLists.txt 中,其中 A-targets 指的是一个全局的 cmake 在
中使用时累积所有目标信息的变量install(TARGETS ...
EXPORT A-targets
...
)
声明。 make install 时创建的是
/tmp/test-install/share/A/cmake/A-targets.cmake
然后与 AConfig.cmake 一起驻留在同一目录中。 请再看一下有关如何使用此文件的 wiki 页面 在 AConfig.cmake 中。
关于 export() 命令:如果您的 项目已经变得巨大,需要相当多的 是时候安装它们了。为了加快速度,你想使用什么 直接在 A 的 build/目录中。这是一个优化,也是 在维基中解释。它仍然可以通过 find_package() 工作,参见
但我强烈建议您使用通常的 make install 现在的路线。
关于c - 如何使用 cmake 导出系统库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7048099/