【问题标题】:CMAKE: determine the build configuration name [duplicate]CMAKE:确定构建配置名称
【发布时间】:2021-08-19 05:29:51
【问题描述】:

在我的项目中,我想根据当前的配置类型设置安装目标的路径:

project(mylib VERSION 1.0)    
set(INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/mylib/${PROJECT_VERSION}/${CMAKE_BUILD_TYPE})
install(TARGETS mylib ARCHIVE DESTINATION ${INSTALL_DIR})

我得到的是:

C:/install/mylib/1.0/mylib.lib

我不明白为什么 CMAKE_BUILD_TYPE 是空的。 看似微不足道的情况,但我已经浪费了一个小时来谷歌搜索解决方案。任何想法? 我正在对 Visual Studio 自动生成的项目进行安装,但我也从命令行尝试过。两者都不起作用:

cmake -DCMAKE_INSTALL_PREFIX="C:\install"

-DCMAKE_GENERATOR_PLATFORM=Win32 .. cmake --install . --config 发布

【问题讨论】:

  • “我已经浪费了一个小时来搜索解决方案” - 只需搜索“CMAKE_BUILD_TYPE empty Visual Studio”即可获得例如that question:Visual Studio 是多配置生成器,它不使用 CMAKE_BUILD_TYPE 变量。
  • Visual Studio(和其他多配置生成器)支持generator expression $<CONFIG>,它表示构建类型。由于install 命令的DESTINATION 参数支持生成器表达式(请参阅documentation),因此您可以在其中使用$<CONFIG>set(INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/mylib/${PROJECT_VERSION}/$<CONFIG>)

标签: visual-studio cmake


【解决方案1】:

这是一个最小的例子:

cmake_minimum_required(VERSION 3.21)
project(mylib VERSION 1.0)

add_library(mylib mylib.cpp)

include(GNUInstallDirs)
install(
  TARGETS mylib 
  ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}/mylib/${PROJECT_VERSION}/$<CONFIG>
)

其中mylib.cpp 就是int mylib() { return 42; }(只是为了安抚编译器)。

您可以通过以下方式以独立于平台的方式进行测试:

$ cmake -G "Ninja Multi-Config" -S . -B build
...
$ cmake --build build --config Debug
...
$ cmake --build build --config Release
...
$ cmake --install build --config Debug --prefix install
-- Installing: /path/to/install/lib/mylib/1.0/Debug/libmylib.a
$ cmake --install build --config Release --prefix install
-- Installing: /path/to/install/lib/mylib/1.0/Release/libmylib.a

关键是使用$&lt;CONFIG&gt;generator expression。在没有首先确认单个配置生成器处于活动状态(通过检查GENERATOR_IS_MULTI_CONFIG 全局属性)的情况下读取CMAKE_BUILD_TYPE从不正确的.即使这样,这也是一个坏主意,因为您不希望 CMakeLists.txt 高度依赖生成器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-23
    • 2015-01-01
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多