CMakeLists.txt中的编译器标志不会出现在CMake-Gui或CMakeCache.txt中

问题描述 投票:9回答:2

我刚刚开始学习CMake并且认为我会理解第一次编写CMakeLists.txt的基本过程,然后配置生成CMakeCache.txt的最终生成Makefiles

但是,当我尝试将它应用于以下CMakeLists.txt时,我没有得到预期的结果,我不确定出了什么问题。 CMakeLists.txt的一部分如下所示:

# compiler flags
if (CMAKE_COMPILER_IS_GNUCXX)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fpermissive -Wall -Wformat-security")
    if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.8)
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-local-typedefs")
    endif()
endif()

由于我使用的是gcc / g ++ 4.7.3,因此应该设置第一个if语句的编译器标志。但是如果我使用CMake-Gui配置它,则没有任何预定义的编译器标志。当我对if语句进行评论并且只保留set(CMAKE_CXX_FLAGS ...)时也会发生同样的情况。在CMakeCache.txt搜索任何-std=c++11标志时,我也没有得到任何结果。

为什么会这样?在不使用CMakeLists.txt时,在make中指定编译器标志有什么意义?或者我得到了一些完全错误的东西而且他们被使用了,但后来我不知道为什么以及如何检查。

当使用__cplusplus生成实际(Eclipse CDT)项目并将其导入Eclipse时,我收到无法解析C ++ 11功能的错误消息,199711宏包含值-std=c++11所以显然没有使用make VERBOSE=1标志。

c++ gcc c++11 cmake
2个回答
8
投票

您在CMakeLists.txt文件中指定的标志可能已被编译器正确使用。你不能直接在CMakeCache.txt中看到它们,但是:

  1. 您可以通过运行make而不是标准CMAKE_VERBOSE_MAKEFILE来查看命令行
  2. 此外,您可以将set your variables with CACHE FORCE设置为1以启用命令打印(可以通过在CMake GUI中选中“高级”来找到)
  3. 正如@Angew所说,如果你真的想在CMake GUI中看到更新的标志,if(MSVC) # MSVC compiler (Win32 only) # Display more warnings set(CMAKE_CXX_FLAGS "/W3") elseif(UNIX OR CMAKE_COMPILER_IS_GNUCXX) # Clang OR Gcc (Linux, Mac OS or Win32 with MingW) # Enable C++11 and displays all warnings set(CMAKE_CXX_FLAGS "-Wall -std=c++11") if(APPLE) # Clang / Mac OS only # Required on OSX to compile c++11 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++ -mmacosx-version-min=10.7") endif(APPLE) endif()

作为一个例子,我在一个项目中使用这种配置一个月,从来没有问题:

set(CMAKE_CXX_FLAGS "...")

更新:

从CMake 3.0开始,您可以用add_compile_options(-std=c++11)替换new syntax

CMake 3.1引入了一个set(CMAKE_CXX_STANDARD 11) 来配置具有特定C ++版本的编译器:

set(VARIABLE "Hello World!" CACHE STRING "")

4
投票

您可以先将变量设置为仅在缓存不在缓存中的值。最后一个参数是我们不需要的描述,因为无论如何我们都会覆盖它。

set(VARIABLE ${VARIABLE} CACHE STRING "Description." FORCE)

然后使用上面一行中的现有值将值强制进入缓存。由于这是缓存的,用户仍然可以更改变量,并且每次都不会被设置。

qazxswpoi

你可以看到,这在CMake中有点笨拙,但它可靠地工作。

© www.soinside.com 2019 - 2024. All rights reserved.