因此,我在使用CMake构建我的软件时遇到了很大的麻烦。
我正在静态构建第三方库(dlib),它需要zlib和libpng(两者都是静态的,我预先构建这些)库来支持PNG功能。 COTS dlib库提供的CMakeFile正在做一个基本的:
target_link_libraries( dlib ${dlib_required_libs})
这使得它的所有库都被配置为" general"库,最终用于发布和调试版本。
这在Linux中不是一个问题,但Windows有一个可爱的功能"指定运行时库(/ MT或/ MD或/ MTd或/ MDd)。这些标志之间的任何不匹配都会在链接时导致多个符号定义错误。即如果libpng是用/ MT构建的,而我的软件使用的是/ MTd,它们将是不兼容的。
为了缓解这种情况,我有两个构建版本的zlib和libpng。一组使用/ MT标志进行发布构建,另一组/ MTd进行Debug构建。这些使用target_link_libraries上的优化/调试标志很愉快地链接到我自己的软件中。但是,dlib(第三方)只是通过编写CMakeFile的方式链接zlib和libpng库的Release集。
我的主要问题是,有没有办法可以覆盖'什么dlib链接而不修改它提供的CMakeFile? 我试图覆盖dlib_LIB_DEPENDS并将其强制进入缓存中,但无济于事。
答案 0 :(得分:3)
FindPNG.cmake
使用的许多其他Find*.cmake
脚本一样, find_package()
脚本并不关心multiconfig构建。所以它只搜索单库,而multiconfig构建自然需要 library-per-config 。
要使搜索到的PNG库为per-config,可以编写自己的FindPNG.cmake
脚本(并设置CMAKE_MODULE_PATH
以指向具有此脚本的目录)。
但是对于具体用法,只需重写原始脚本的输出就更简单了,即设置PNG_LIBRARY
缓存变量指向 library-per-config :
优化 png-lib-release debug png-lib-debug
或使用生成器表达式
$< $< CONFIG:发行>: PNG-LIB-释放> $< $< CONFIG:调试>: PNG-LIB-调试>`
(而不是 png-lib-release 和 png-lib-debug 应该是相应的库版本和调试版本的路径。)
这两个值都应该与target_link_libraries
命令一起使用,
生成per-config链接。
答案 1 :(得分:0)
Dlib附带了dlib / external中的libpng和zlib副本。默认情况下,dlib的CMakeLists.txt将以正确的方式构建它们并将它们静态链接到您的程序中。所以解决方案是让它做到这一点。不要尝试创建一个单独的静态库,因为正如您所指出的那样,这会在Windows上造成很多麻烦。