1

所以我在用 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 并出于绝望将其强制放入缓存中,但无济于事。

4

2 回答 2

3

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

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

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

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

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

$<$<CONFIG:Release>: png-lib-release >$<$<CONFIG:Debug>: png-lib-debug >`

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

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

于 2016-03-05T16:47:20.917 回答
0

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

于 2016-03-03T23:46:02.850 回答