【发布时间】:2011-10-26 06:15:13
【问题描述】:
如何导出 cmake 库所依赖的库,使得依赖于该库的可执行文件不必手动依赖该库的依赖项?
这有点拗口,所以这里有一个例子:
dummy(应用程序)----> 依赖于 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 的东西?不。)
【问题讨论】:
-
系统库的安装应由package manager处理