gpt4 book ai didi

c++ - CMake:覆盖由 target_link_libraries 添加的库

转载 作者:行者123 更新时间:2023-11-30 02:33:07 28 4
gpt4 key购买 nike

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

最佳答案

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

要使搜索到的 PNG 库成为每个配置,可以编写自己的 FindPNG.cmake 脚本(并设置 CMAKE_MODULE_PATH 以指向包含此脚本的目录) .

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

optimized png-lib-release debug png-lib-debug

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

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

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

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

关于c++ - CMake:覆盖由 target_link_libraries 添加的库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35783705/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com