【问题标题】:CMake: Override libraries added by target_link_librariesCMake:覆盖由 target_link_libraries 添加的库
【发布时间】:2016-06-17 11:01:43
【问题描述】:

所以我在用 CMake 构建我的软件时遇到了很大的麻烦。

我正在静态构建第三方库 (dlib),它需要 zlib 和 libpng(都是静态的,我预先构建了这些)库来支持 PNG 功能。 COTS dlib 库提供的CMakeFile 是做基础的:

target_link_libraries( dlib ${dlib_required_libs}) 

这会将其所有库配置为“通用”库,最终用于发布和调试构建。

这在 Linux 中不是问题,但 Windows 有一个可爱的“功能”,即指定运行时库(/MT 或 /MD 或 /MTd 或 /MDd)。这些标志之间的任何不匹配都会导致链接时出现多个符号定义错误。即如果 libpng 是用 /MT 构建的,而我的软件使用 /MTd,它们将不兼容。

为了缓解这个问题,我有两个内置版本的 zlib 和 libpng。一组使用 /MT 标志用于发布版本,另一组 /MTd 用于调试版本。这些在使用它们的 target_link_libraries 上使用优化/调试标志愉快地链接到我自己的软件。但是,dlib(第 3 方)仅通过编写 CMakeFile 的方式链接 zlib 和 libpng 库的发布集。

我的主要问题是,有没有一种方法可以“覆盖”dlib 链接的内容而不修改它提供的 CMakeFile? 我试图覆盖 dlib_LIB_DEPENDS 并出于绝望将其强制放入缓存中,但无济于事。

【问题讨论】:

  • 根据dlib/CMakeLists.txtPNG库是通过find_package搜索的,zlib是从dlib项目本身的源代码编译而来的。所以与zlib 链接不是问题:编译的zlib 采用与dlib 本身相同的编译定义,不是吗?
  • 遗憾的是,libpng 依赖于 zlib,因此需要一个预编译的 zlib 来编译 libpng。
  • 好吧,实际上,让我纠正一下。需要一个匹配的 zlib 库(使用 /MT 或 /MTd)来链接与相应的 libpng。
  • 嗯,由于使用find_package 搜索PNG,最简单的方法是将缓存变量PNG_LIBRARY 设置为您需要的值:optimized png-lib-release debug png-lib-debug$<$<CONFIG:Release>:png-lib-release>$<$<CONFIG:Debug>:png-lib-debug>
  • 嗯,这听起来不错,我会试一试

标签: c++ cmake cross-platform dlib


【解决方案1】:

Dlib 在 dlib/external 中带有 libpng 和 zlib 的副本。默认情况下,dlib 的 CMakeLists.txt 将以正确的方式构建它们并将它们静态链接到您的程序中。所以解决方案是让它这样做。不要尝试创建单独的静态库,因为正如您所指出的,这会在 Windows 上造成很多麻烦。

【讨论】:

  • 忘了提到我使用的是旧版本的 dlib,它不附带 libpng 和 zlib,没有升级选项。不过答案很好
  • dlib 在发行版中包含 libpng 和 zlib 至少已经有两年了。为什么不使用更新的版本?
  • 因为这不在我的控制之下,而且使用它的(多个)程序比这更古老。
  • 啊,是的,这很痛苦 :)
【解决方案2】:

FindPNG.cmake 脚本与find_package() 使用的许多其他Find*.cmake 脚本一样,不关心多配置构建。所以它只是搜索 single library,而 multiconfig 构建自然需要 library-per-config

为了使搜索的 PNG 库成为 per-config,可以编写自己的 FindPNG.cmake 脚本(并设置 CMAKE_MODULE_PATH 指向该脚本所在的目录)。

但对于具体用法,只需重写原始脚本的输出就更简单了,即设置 PNG_LIBRARY 缓存变量指向 library-per-config

优化png-lib-release调试png-lib-debug

或者,使用生成器表达式,

$:png-lib-release>$:png-lib-debug>`

(而不是 png-lib-releasepng-lib-debug 应该是相应的库的发布和调试版本的路径)。

这两个值都应与target_link_libraries 命令一起使用, 生成每个配置的链接。

【讨论】:

  • 感谢您写一个答案,以防万一有人遇到这个问题。
猜你喜欢
  • 2012-01-26
  • 1970-01-01
  • 2011-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-09
  • 2021-12-12
相关资源
最近更新 更多