繁体   English   中英

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

[英]Compiler Flags from CMakeLists.txt don't appear in CMake-Gui or CMakeCache.txt

我刚开始学习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语句进行out-comment并保留set(CMAKE_CXX_FLAGS ...)发生同样的情况。 CMakeCache.txt搜索任何-std=c++11标志时,我也没有得到任何结果。

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

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

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

  1. 您可以通过运行make VERBOSE=1而不是标准make来查看命令行
  2. 此外,您可以将CMAKE_VERBOSE_MAKEFILE设置为1以启用命令打印(可以通过在CMake GUI中选中“高级”来找到)
  3. 正如@Angew所说,如果您真的想在CMake GUI中看到更新的标志, 请使用CACHE FORCE设置变量

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

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()

更新

从CMake 3.0开始,您可以用add_compile_options(-std=c++11)替换set(CMAKE_CXX_FLAGS "...") add_compile_options(-std=c++11)

CMake 3.1引入了一种新的语法来配置具有特定C ++版本的编译器:

set(CMAKE_CXX_STANDARD 11)

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM