簡體   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