[英]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中看到它們,但是:
make VERBOSE=1
而不是標准make
來查看命令行 CMAKE_VERBOSE_MAKEFILE
設置為1以啟用命令打印(可以通過在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.