【问题标题】:cmake: add "d" suffix for debug build of static librarycmake:为静态库的调试构建添加“d”后缀
【发布时间】:2018-09-15 06:29:14
【问题描述】:

我想为类似于此处提到的库实施一种命名方案: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_STATIC_LIBRARY_PREFIXCMAKE_STATIC_LIBRARY_SUFFIX 是为此目的而设计的。
  • @MariusBancila 这是在 Windows 上用于静态库文件名 .lib 结尾的后缀。我不确定它是否打算更改为 d.lib。
  • 请记住,对于任何想要使用您的库的人来说,这会立即引入更多工作。您的图书馆的用户必须处理您添加到图书馆名称的所有前缀和后缀意大利面条。即使对于单个库来说,这也是一件很痛苦的事情,更不用说如果你必须处理好几个了。始终尝试提供一个自动完成工作的抽象层(例如 FindTest.cmake 在您的情况下)。

标签: c++ visual-studio cmake


【解决方案1】:

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 来查找此类库:更喜欢使用导入的目标而不是粗粒度的遗留 debugoptimized 限定符 target_link_librariesConfig file packages 提供了一种方便的方式将此类导入的目标公开给您的客户,并且他们还会自动为您处理任何后缀恶作剧。

【讨论】:

  • 哪些解决方案是“现代 cmake”?我现在总是犹豫是否直接使用set(),因为我想知道是否有专门的解决方案。
  • @Sandburg 现代方法是在提供方使用DEBUG_POSTFIX 目标属性,并为库的下游用户生成一个配置文件包。
  • @ComicSansMS 完全正确。对于未来的读者,这可能是它的外观:set_target_properties(<target-name> PROPERTIES DEBUG_POSTFIX "d")
猜你喜欢
  • 2018-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多