【发布时间】: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.txt,
PNG库是通过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