我应该在 CMakeLists.txt w.r.t 中做啥?构建类型?

Posted

技术标签:

【中文标题】我应该在 CMakeLists.txt w.r.t 中做啥?构建类型?【英文标题】:What should I do in CMakeLists.txt w.r.t. the build type?我应该在 CMakeLists.txt w.r.t 中做什么?构建类型? 【发布时间】:2020-04-19 12:03:54 【问题描述】:

我是一些使用 CMake 构建的库的作者。

如果用户指定他们运行 cmake 的构建类型 - 我可以强制执行,没问题。

但是当用户指定构建类型时,最佳实践是什么?

我应该忽略它吗? 我应该自己选择一种构建类型作为后备/默认构建类型吗?如果有,是哪个? 我读过这个Kitware blog entry,它提出了一种解决问题的方法并将其置于库依赖项中。该方法封装在this module 中。我应该使用它吗?

到目前为止,我一直在强制执行某些特定的构建类型,有人建议我也许不应该这样做。

【问题讨论】:

您之前的一个问题与该主题非常相关:***.com/q/46820155/3440745。而它的accepted answer 应该可以阐明您当前的问题。 我会说把它留给客户。我从源代码构建了数十个库,但从未见过预设的构建类型。 【参考方案1】:

我认为有两个不错的选择:

    如果CMAKE_BUILD_TYPE 未设置并且活动生成器是单一配置,警告用户什么都不做。无论如何,警告只对新手用户有用。高级用户可能(但不太可能)打算这样做。在这种情况下,警告很烦人。

为了正确实现 (1),下面的代码 sn-p(放在早期,最好在 project() 之后)将起作用:

cmake_minimum_required(VERSION 3.9)

# ...

get_property(is_multi_config GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
if (NOT is_multi_config AND NOT DEFINED CMAKE_BUILD_TYPE)
  message(WARNING "Must set CMAKE_BUILD_TYPE for single-config generators.")
endif ()

【讨论】:

以上是关于我应该在 CMakeLists.txt w.r.t 中做啥?构建类型?的主要内容,如果未能解决你的问题,请参考以下文章

将 Makefile 转换为 CMakeLists.txt

CMake---基础练习1

在 CMakeLists.txt 中添加 FLTK 库

在 CMakeLists.txt 中链接 GSL

从父 CMakeLists.txt 覆盖 CMake 中的默认选项(...)值

从 Visual Studio 生成 CMakeLists.txt