cmake

2012-10-03 25 views
11

में C++ 0x समर्थन जोड़ें मेरे पास cmake में कॉन्फ़िगर किया गया एक बड़ा अनुप्रयोग है। मैंने हाल ही में कुछ कक्षाओं को जोड़ा है जो सी ++ 0x कार्यक्षमता का उपयोग करते हैं, और यह बिल्ड को तोड़ देता है, क्योंकि सेमेक को C++ 0x समर्थन के साथ संकलित करने के लिए कॉन्फ़िगर नहीं किया गया है। मैं इसे cmake के विकल्प के रूप में कैसे जोड़ूं?cmake

+1

यदि आप नए कंपाइलर का उपयोग कर रहे हैं, तो आपको इसके बजाय '-std = C++ 11' का उपयोग करना चाहिए। यह अब एक मसौदा नहीं है। –

उत्तर

9

आप CMAKE_CXX_FLAGS करने के लिए ध्वज जोड़ने की जरूरत:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x") 
7

मैं जीसीसी के लिए इस स्निपेट का उपयोग, लेकिन यह एक और अधिक जटिल तरीका

if(CMAKE_COMPILER_IS_GNUCXX) 
    SET(ENABLE_CXX11 "-std=c++11") 

    EXECUTE_PROCESS(COMMAND "${CMAKE_CXX_COMPILER} -dumpversion" OUTPUT_VARIABLE GCC_VERSION) 
    if (GCC_VERSION VERSION_LESS 4.7) 
     SET(ENABLE_CXX11 "-std=c++0x") 
    endif() 

    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${ENABLE_CXX11}") 
endif() 
0

है मैं निम्नलिखित मॉड्यूल है:

$ cat FindCXX11.cmake 
# - Finds if the compiler has C++11 support 
# This module can be used to detect compiler flags for using C++11, and checks 
# a small subset of the language. 
# 
# The following variables are set: 
# CXX11_FLAGS - flags to add to the CXX compiler for C++11 support 
# CXX11_FOUND - true if the compiler supports C++11 
# 
# TODO: When compilers starts implementing the whole C++11, check the full set 

include(CheckCXXSourceCompiles) 
include(FindPackageHandleStandardArgs) 

set(CXX11_FLAG_CANDIDATES 
    #Gnu and Intel Linux 
    "-std=c++0x" 
    #Microsoft Visual Studio, and everything that automatically accepts C++11 
    " " 
    #Intel windows 
    "/Qstd=c++0x" 
    ) 

set(CXX11_TEST_SOURCE 
" 
class Matrix 
{ 
public: 
    Matrix(int a, int b, int c, int d) 
     : data {a, b, c, d} 
    {} 

private: 
    int data[4]; 
}; 

int main() 
{ 
    int n[] {4,7,6,1,2}; 
    for (auto i : n) 
     Matrix mat (3,5,1,2); 
    return 0; 
} 
") 

foreach(FLAG ${CXX11_FLAG_CANDIDATES}) 
    set(SAFE_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}") 
    set(CMAKE_REQUIRED_FLAGS "${FLAG}") 
    unset(CXX11_FLAG_DETECTED CACHE) 
    message(STATUS "Try C++11 flag = [${FLAG}]") 
    check_cxx_source_compiles("${CXX11_TEST_SOURCE}" CXX11_FLAG_DETECTED) 
    set(CMAKE_REQUIRED_FLAGS "${SAFE_CMAKE_REQUIRED_FLAGS}") 
    if(CXX11_FLAG_DETECTED) 
     set(CXX11_FLAGS_INTERNAL "${FLAG}") 
     break() 
    endif(CXX11_FLAG_DETECTED) 
endforeach(FLAG ${CXX11_FLAG_CANDIDATES}) 

set(CXX11_FLAGS "${CXX11_FLAGS_INTERNAL}") 

find_package_handle_standard_args(CXX11 DEFAULT_MSG CXX11_FLAGS) 
mark_as_advanced(CXX11_FLAGS) 

मैं यह देखने के लिए इसका उपयोग करता हूं कि सी ++ 11 का सबसेट मैं उपयोग कर रहा हूं (वास्तव में यह अब अनावश्यक है, क्योंकि मैं आप हूं बहुत अधिक गाओ), संकलक द्वारा समर्थित है। इसे आगे बनाना और अधिक सुविधाएं जोड़ना आसान है, और अन्य कंपाइलर स्विच जोड़ें। असल में केवल एकमात्र कंपाइलर जो मैंने पाया है, जो इस परीक्षा को पास करता है, जीसीसी> = 4.6 और क्लैंग> = 3.1 है यदि मुझे सही याद है।

0

जैसा कि this answer में दिखाया गया है, आपको आवश्यक विशेषताओं के लिए समर्थन की आवश्यकता के लिए target_compile_features का उपयोग करना बेहतर है।

यह बताता है कि दस्तावेजों को आपके कोड की कार्यक्षमता की आवश्यकता है, क्रॉस-प्लेटफ़ॉर्म संगत है, और उपयोगकर्ता को उनके कंपाइलर में आवश्यक सुविधा उपलब्ध नहीं होने पर उपयोगकर्ता को अधिक उपयोगी त्रुटि संदेश देगा।

इस विकल्प के लिए manual page से

:

target_compile_features 

जोड़ें उम्मीद लक्ष्य को संकलक सुविधाओं।

target_compile_features(<target> <PRIVATE|PUBLIC|INTERFACE> <feature> [...]) 

किसी दिए गए लक्ष्य को संकलित करते समय आवश्यक संकलक सुविधाओं को निर्दिष्ट करें। यदि सुविधा CMAKE_C_COMPILE_FEATURES चर या CMAKE_CXX_COMPILE_FEATURES चर में सूचीबद्ध नहीं है, तो सीएमके द्वारा एक त्रुटि की सूचना दी जाएगी। यदि सुविधा के उपयोग के लिए एक अतिरिक्त कंपाइलर ध्वज की आवश्यकता है, जैसे -std=gnu++11, ध्वज स्वचालित रूप से जोड़ा जाएगा।

इस मैक्रो के साथ परीक्षण की जा सकने वाली सुविधाओं की सूची (उम्मीदपूर्वक पूर्ण) here है।

 संबंधित मुद्दे