2017-07-07 91 views
0

我需要用/std:c++17替換INTERFACE目標(僅標頭庫)的/std:c++14標誌。 CMake不支持直接在VS中設置C++ 17標誌(請參閱How to enable /std:c++17 in VS2017 with CMake),因此我需要手動將其替換。CMake:替換INTERFACE目標的編譯標誌

然而get_target_property(my_compile_flags mylib COMPILE_OPTIONS)檢索的當前設置標誌的列表隨後替換/ STD:C++ 14/STD:C++ 17不起作用:

INTERFACE_LIBRARY目標只可能列入白名單屬性。屬性「COMPILE_OPTIONS」是不允許的。

但是,您可以通過target_compile_features(...)設置它們,然後通過手動方式設置它們。 target_compile_options(mylib INTERFACE /std:c++17)。但後者命令增加了的標誌,而不刪除/std:c++14

如何去解決這個問題?

回答

3

對於接口庫,您需要更改INTERFACE_COMPILE_DEFINITIONS而不是COMPILE_DEFINITIONS(請參閱add_library(INTERFACE))。

下面是一個完整的例子,我用VS2017測試(使用/std:c++latest,因爲目前還不支持/std:c++17可以通過CMake的被忽略/刪除):

cmake_minimum_required(VERSION 3.8) 

project(InterfaceLibCppStd) 

include(CheckCXXCompilerFlag) 

file(WRITE "mylib/Definitions.h" [=[ 
    #define HELLO_TEXT "Hello Interface Lib" 
]=]) 
add_library(mylib INTERFACE) 

target_include_directories(mylib INTERFACE "mylib") 
target_compile_options(mylib INTERFACE "/std:c++14") 

file(WRITE "main.cpp" [=[ 
    #include "Definitions.h" 
    #include <iostream> 

    int main() 
    { 
     std::cout << HELLO_TEXT << std::endl; 
    } 
]=]) 
add_executable(myexe "main.cpp") 

if (MSVC_VERSION GREATER_EQUAL "1900") 
    CHECK_CXX_COMPILER_FLAG("/std:c++latest" _cpp_latest_flag_supported) 
    if (_cpp_latest_flag_supported) 
     get_target_property(_opt_old mylib INTERFACE_COMPILE_OPTIONS) 
     string(REPLACE "14" "latest" _opt_new "${_opt_old}") 
     set_target_properties(mylib PROPERTIES INTERFACE_COMPILE_OPTIONS "${_opt_new}") 
    endif() 
endif() 

target_link_libraries(myexe PUBLIC mylib) 
+0

啊哈,爽!謝謝!祝賀10k代表:-) – Ela782

+0

@ Ela782謝謝:-)不用客氣。只是它會很好 - 在回答時幫助我們/我 - 如果您可以在未來的問題中添加[mcve]作爲測試用例。 – Florian