c++ - cmake:为静态库的调试构建添加 "d"后缀

标签 c++ visual-studio cmake

我想为库实现一个类似于此处提到的命名方案:Library name for x32 vs x64

CMakeLists.txt 文件设置为创建静态库

add_library(test test.h test.cpp)

从 cmake 列表创建 visual studio 解决方案后,项目的设置方式是将调试库 test.lib 写入 /x64/Debug/test.lib 并发布版本写入 /x64/Release/test.lib。我宁愿将它们都写到 /lib/ 但在调试版本后附加一个“d”。思路是得到

/lib/test.lib
/lib/testd.lib

如果可能的话,为 64 位构建添加一个额外的后缀

/lib/test.lib
/lib/test64.lib
/lib/testd.lib
/lib/test64d.lib

有没有直接的方法来做到这一点?


编辑: 这可以稍后在项目中使用这样的库很好地使用: Linking different libraries for Debug and Release builds in Cmake on windows?


编辑:我在从输出中删除 Debug 和 Release 文件夹时遇到问题,可以通过以下答案解决:How to not add Release or Debug to output path?

最佳答案

CMAKE_DEBUG_POSTFIX用于为调试库附加 d:

set(CMAKE_DEBUG_POSTFIX d)

如果你不想全局设置这个,你也可以使用DEBUG_POSTFIX目标属性而不是选定的库。

没有相应的功能来区分 32/64 位构建,但由于不可能在同一 CMake 配置中混合使用这两者,您可以手动轻松区分这些情况,例如

if(CMAKE_SIZEOF_VOID_P EQUAL 4)
    set(ARCH_POSTFIX "")
else()
    set(ARCH_POSTFIX 64)
endif()

add_library(my_lib${ARCH_POSTFIX} [...])

或者,如果您想在不同的体系结构上使用相同的目标名称,请设置一个变量,如 CMAKE_STATIC_LIBRARY_SUFFIX (存在一大堆它们,因此您可以为您的目标类型选择正确的一个,并根据您想要附加后缀的输出文件)。

因为您还提到了 this answer用于查找此类库:优先使用导入的目标,而不是 target_link_libraries 的粗粒度遗留 debugoptimized 限定符。 Config file packages提供一种将此类导入的目标公开给您的客户的便捷方式,它们还会自动为您处理任何后缀恶作剧。

关于c++ - cmake:为静态库的调试构建添加 "d"后缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49672264/

相关文章:

c++ - 构建wxWidgets Hello world

cmake - 如何使 cpack 不向 RPM 添加所需的库?

c++ - 设计模式、Qt 模型/ View 和多线程

c++ - 在opencv和c++中画西门子星

c++ - term 不计算为采用 1 个参数的函数

c# - Visual Studio 2010 自动化和环境变量

visual-studio - Visual Studio 2013 和 ASP.NET Web 配置工具

visual-studio - 如何为 Visual C++ 2013 项目使用外部构建系统?

c++ - 无法从 CMake 生成 makefile

c++ - 构造函数的初始化列表