c - 如何使用 cmake 导出系统库?

标签 c cmake

如何导出 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/

相关文章:

c++ - tr1/normal_distribution : No such file or directory

cmake - 获取由命令 add_definitions() 和 add_compile_options() 设置的 C/CXX FLAGS

c - 为什么 Newlib C 标准库实现的 strtod() 和 strtof() 使用动态内存分配?

c - 什么时候需要动态内存?

c++ - AIX CMakeTest 没有添加正确的 -lpthread

opencv - 使用Visual Studio配置OpenCV的三种方法?

c++ - CPack DEB 生成器 : control-file-has-bad-permissions mdsums 0644 ! = 0644

c - x264编码帧率限制

c - 如何使用 Visual Studio 2017 只编译 C 代码而不考虑 C++?

c - 打印字符数组时 Valgrind 读取大小为 8 的内容无效