使用多重配置生成器时,CMake配置特定的库名称

时间:2018-07-01 20:02:50

标签: cmake

运行cmake -G "Visual Studio 15 2017 Win64"

cmake_minimum_required(VERSION 3.10)
project(test CXX)
add_library(MyLib SHARED foo.cpp)
install(TARGETS MyLib DESTINATION $ENV{TEMP})

生成具有多个配置(ReleaseDebug,...)的项目,然后可以使用Visual Studio进行构建。

问题::安装库(即生成名为INSTALL的生成项目)时,Debug构建会很高兴地覆盖Release构建,反之亦然反之亦然。

我正在寻找的一种方法,可以为每种配置创建不同的库名称,例如MyLib用于发布版本,MyLibd用于调试版本。

我尝试过的操作:使用单配置生成器时,我会查询CMAKE_BUILD_TYPE并为每种配置的库提供不同的名称。但是"Visual Studio 15 2017 Win64"是一个多配置生成器,因此我无法应用这种技术。

我已经阅读了generator expressions,但所有示例仅显示了应用于输入参数(例如输入文件或目录)的生成器表达式。确实,像

add_library(MyLib$<$<CONFIG:Debug>:d> SHARED foo.cpp)

仅会产生令人讨厌的CMake错误消息,并且不会产生使库名称取决于配置的预期效果。

我当然可以创建一个自定义命令,该命令在安装时重命名该文件,但是据我了解,CMake具有“包括电池”,必须有一种更简单的方法。生成器表达式看起来非常有前途,但是似乎不像我尝试过的那样起作用。

问题::如何根据配置来确定库的名称?

2 个答案:

答案 0 :(得分:1)

您可以将库目标的DEBUG_POSTFIX属性分配给调试构建使用不同的后缀。

或者您可以通过分配CMAKE_DEBUG_POSTFIX变量来对所有目标执行此操作:

set(CMAKE_DEBUG_POSTFIX "d")
#... Create a library after the setting the postfix.
add_library(MyLib SHARED foo.cpp)

答案 1 :(得分:1)

@Tsyvarev关于设置库目标的属性的提示导致了另一种解决方案:有一个目标属性OUTPUT_NAME,这确实允许使用生成器表达式。

所以,一个人可以写

set_target_properties(MyLib PROPERTIES OUTPUT_NAME "MyLib$<$<CONFIG:Debug>:d>")