cmake:添加“ d”后缀以调试静态库

Beg*_*ner 5 c++ cmake visual-studio

我想为库实现一个类似于这里提到的命名方案:x32 vs x64的库名

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

add_library(test test.h test.cpp)
Run Code Online (Sandbox Code Playgroud)

从cmake列表创建Visual Studio解决方案后,将以如下方式设置项目:将调试库test.lib写入/x64/Debug/test.lib,将发行版本写入/x64/Release/test.lib。我宁愿将它们都写/lib/在调试版本上,但要在调试版本后加上“ d”。这个想法是要

/lib/test.lib
/lib/testd.lib
Run Code Online (Sandbox Code Playgroud)

如果可能的话,还有一个用于64位版本的附加后缀

/lib/test.lib
/lib/test64.lib
/lib/testd.lib
/lib/test64d.lib
Run Code Online (Sandbox Code Playgroud)

有没有简单的方法可以做到这一点?


编辑:以后可以使用这样的库在项目中很好地使用它: 在Windows的Cmake中为Debug和Release版本链接不同的库?


编辑:我在从输出中删除Debug和Release文件夹时遇到问题,可以通过以下答案解决:如何不将Release或Debug添加到输出路径?

Com*_*sMS 8

CMAKE_DEBUG_POSTFIX用于附加dfor调试库:

set(CMAKE_DEBUG_POSTFIX d)
Run Code Online (Sandbox Code Playgroud)

如果不想全局设置,也可以DEBUG_POSTFIX在选定的库上使用target属性。

没有区分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} [...])
Run Code Online (Sandbox Code Playgroud)

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

并且由于您还提到了找到此类库的答案:最好使用导入的目标,而不是使用粗粒度的旧版debugoptimized限定符target_link_libraries配置文件包提供了一种将此类导入的目标暴露给客户的便捷方法,并且它们还可以自动为您处理任何后缀。

  • @ComicSansMS 完全正确。对于未来的读者来说,它可能是这样的:`set_target_properties(<target-name> PROPERTIES DEBUG_POSTFIX "d")` (4认同)
  • @Sandburg 现代方法将在提供方使用`DEBUG_POSTFIX` 目标属性,并为库的下游用户生成一个配置文件包。 (3认同)