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