为啥 CMake 在没有 CMAKE_CXX_FLAGS 的情况下生成 Makefile?

Posted

技术标签:

【中文标题】为啥 CMake 在没有 CMAKE_CXX_FLAGS 的情况下生成 Makefile?【英文标题】:Why CMake generate Makefile without CMAKE_CXX_FLAGS?为什么 CMake 在没有 CMAKE_CXX_FLAGS 的情况下生成 Makefile? 【发布时间】:2017-12-08 11:10:05 【问题描述】:

这是我的完整 CMakeLists.txt 文件:

set(CMAKE_BUILD_TYPE Release)
set(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS -Wall -Wextra -Wshadow")

set(PROJECT sample)
project($PROJECT)

set(HEADERS
    Main.h
)
set(SOURCES 
    Main.cpp
)

# Add souce file to project for compile
add_executable ($PROJECT $HEADERS $SOURCES)

target_link_libraries( $PROJECT )

但是,在 Makefile 中,我不会从 CMAKE_CXX_FLAGS 中寻找子字符串“-Wall”和其他选项。

为什么?

【问题讨论】:

【参考方案1】:

CMAKE_CXX_FLAGS 变量最初是使用project() 命令设置的。在project() 命令之后移动set(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS ...")

来自CMake Toolchains - Languages 文档:

语言由project() 命令启用。通过调用project() 命令设置特定语言的内置变量,例如CMAKE_CXX_COMPILERCMAKE_CXX_COMPILER_ID 等。如果顶层 CMakeLists 文件中没有项目命令,则会隐式生成一个。默认启用的语言是CCXX

参考文献

CMake and Make need to be run twice in order to build code successfully CMake: In which Order are Files parsed (Cache, Toolchain, …)?

【讨论】:

谢谢,这是工作。但是官方文档中的哪些地方(在项目之后)讲述了这个特性?我找到了项目页面cmake.org/cmake/help/v3.10/command/project.html,但没有关于 CXX 选项和项目的任何说明。 @Xintrea 这是CMake Toolchains - Languages 文档的一部分。我会将此添加到我的答案中。

以上是关于为啥 CMake 在没有 CMAKE_CXX_FLAGS 的情况下生成 Makefile?的主要内容,如果未能解决你的问题,请参考以下文章

为啥cmake没有在makefile中添加库链接命令?

为啥 CMake 似乎没有使用 add_compile_options 命令应用 -pthread?

为啥 cmake 文件 GLOB 是邪恶的?

为啥 CMake 没有与我的自定义库(add_library/set_property)链接?

为啥 CMake 在 Qt Creator 中过早结束?

CMake+MinGW编译OpenCV2.1以后为啥Bin和Lib文件夹是空的