मैं एक सीकेक फ़ाइल में एक लिंकर या संकलन ध्वज कैसे जोड़ूं?


220

मैं arm-linux-androideabi-g++कंपाइलर का उपयोग कर रहा हूं । जब मैं एक सरल संकलन करने की कोशिश करता हूं "हैलो, वर्ल्ड!" कार्यक्रम यह संकलन ठीक है। जब मैं उस कोड में एक साधारण अपवाद हैंडलिंग को जोड़कर इसका परीक्षण करता हूं तो यह भी काम करता है (जोड़ने के बाद -fexceptions.. मुझे लगता है कि यह डिफ़ॉल्ट रूप से अक्षम है)।

यह एक Android डिवाइस के लिए है, और मैं केवल CMake का उपयोग करना चाहता हूं, नहीं ndk-build

उदाहरण के लिए - first.cpp

#include <iostream>

using namespace std;

int main()
{
   try
   {
   }
   catch (...)
   {
   }
   return 0;
}

./arm-linux-androideadi-g++ -o first-test first.cpp -fexceptions

यह बिना किसी समस्या के काम करता है ...

समस्या ... मैं फ़ाइल को सीएमके फ़ाइल के साथ संकलित करने का प्रयास कर रहा हूं।

मैं -fexceptionsएक ध्वज के रूप में जोड़ना चाहता हूं । मैंने कोशिश की

set (CMAKE_EXE_LINKER_FLAGS -fexceptions ) or set (CMAKE_EXE_LINKER_FLAGS "fexceptions" )

तथा

set ( CMAKE_C_FLAGS "fexceptions")

यह अभी भी एक त्रुटि प्रदर्शित करता है।


अभी मुझे एक ही समस्या हो रही है, और मैं विभिन्न चीजों की कोशिश कर रहा हूं। थोड़ा रुको और मैं एक जवाब पोस्ट करता हूं। संकलित झंडे के लिए, एक अशुद्ध लेकिन आसान तरीका है: add_definitions ("- truc")
Offirmo

इस प्रश्न पर अधिक चर्चा के लिए (विशेषकर यदि आप CMake 3.x या नए का उपयोग कर रहे हैं): CMake में सामान्य संकलित झंडे स्थापित करने की आधुनिक विधि क्या है?
कॉमिकसंसमेंट

यदि लिंक फ़्लैग्स जो आप rpath को कॉन्फ़िगर करने के उद्देश्य से चाहते हैं, तो विशिष्ट CMake rpath कमांड gitlab.kitware.com/cmake/community/wikis/doc/cmake/…
गेब्रियल डेवलेर्स

जवाबों:


243

मान लें कि आप उन झंडों को जोड़ना चाहते हैं (उन्हें निरंतर में घोषित करने के लिए बेहतर है):

SET(GCC_COVERAGE_COMPILE_FLAGS "-fprofile-arcs -ftest-coverage")
SET(GCC_COVERAGE_LINK_FLAGS    "-lgcov")

उन्हें जोड़ने के कई तरीके हैं:

  1. सबसे आसान एक (साफ नहीं है, लेकिन आसान और सुविधाजनक है, और केवल संकलन झंडे के लिए काम करता है, एक बार में C & C ++):

    add_definitions(${GCC_COVERAGE_COMPILE_FLAGS})
  2. संबंधित सीएमके चर के लिए आवेदन:

    SET(CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}")
    SET(CMAKE_EXE_LINKER_FLAGS  "${CMAKE_EXE_LINKER_FLAGS} ${GCC_COVERAGE_LINK_FLAGS}")
  3. लक्ष्य गुणों का उपयोग करते हुए, सीएफ। डॉक्टर सीएमके ने ध्वज लक्ष्य संपत्ति संकलित की और लक्ष्य नाम जानने की जरूरत है।

    get_target_property(TEMP ${THE_TARGET} COMPILE_FLAGS)
    if(TEMP STREQUAL "TEMP-NOTFOUND")
      SET(TEMP "") # Set to empty string
    else()
      SET(TEMP "${TEMP} ") # A space to cleanly separate from existing content
    endif()
    # Append our values
    SET(TEMP "${TEMP}${GCC_COVERAGE_COMPILE_FLAGS}" )
    set_target_properties(${THE_TARGET} PROPERTIES COMPILE_FLAGS ${TEMP} )

अभी मैं विधि 2 का उपयोग करता हूं।


4
क्यों add_definitions () अशुद्ध है?
leinaD_natipaC

14
@leinaD_natipaC: आधिकारिक दस्तावेज कहता है: इस कमांड का इस्तेमाल किसी भी झंडे को जोड़ने के लिए किया जा सकता है, लेकिन इसका इरादा प्रीप्रोसेसर परिभाषाओं को जोड़ना है । मुझे लगता है इसीलिए।
बेनोइट ब्लांचन

हालांकि यह स्वीकृत उत्तर है, यह वास्तव में बहुत पुरानी शैली CMAKE दिखाती है, @vitaut द्वारा उत्तर का संदर्भ दें कि किसी भी नए CMAKE कोड को समय मापदंडों के संकलन के संबंध में कैसे संरचित किया जाना चाहिए
Harald Scheirich

1
string(APPEND CMAKE_EXE_LINKER_FLAGS "new_value")कम है और क्लीनरset(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} new_value")
खूनी

165

सीएमके के नए संस्करणों में आप एक ही लक्ष्य के लिए संकलक और लिंकर झंडे सेट कर सकते हैं target_compile_optionsऔर target_link_librariesक्रमशः (हां, बाद के सेट लिंकर विकल्प):

target_compile_options(first-test PRIVATE -fexceptions)

इस पद्धति का लाभ यह है कि आप अन्य लक्ष्यों के लिए विकल्पों के प्रसार को नियंत्रित कर सकते हैं जो इस पर निर्भर करते हैं PUBLICऔर PRIVATE

3.13 सीएमके के रूप में आप target_link_optionsलिंकर विकल्पों को जोड़ने के लिए भी उपयोग कर सकते हैं जो इरादे को और अधिक स्पष्ट करता है।


2
मैंने इसका उपयोग करने की कोशिश की है: target_compile_options(main_static PRIVATE --static)लेकिन यह काम नहीं करता है, किसी भी विचार क्यों?
पवेल सजगुर

2
-staticशायद संकलक है, संकलक विकल्प नहीं। इसे पास करने का प्रयास करें target_link_libraries
विटाट

9
ओह, target_link_librariesमैंने डॉक्टर के उस हिस्से को याद किया है: " दिए गए लक्ष्य को लिंक करते समय उपयोग करने के लिए पुस्तकालयों या झंडे निर्दिष्ट करें ।"। धन्यवाद।
पावेल स्ज़ेसुर

3
एक हालिया जोड़: सीएमके 3.13 target_link_optionsलिंकर झंडे को निर्दिष्ट करने के लिए एक क्लीनर के रूप में पेश करता है। आपको target_link_librariesभविष्य में लिंकर झंडे के लिए उपयोग करने से बचना चाहिए और target_link_optionsइसके बजाय उपयोग करना चाहिए।
कॉमिकसंस

1
Add_compile_options भी है - देखें stackoverflow.com/questions/39501481/… और अधिक हाल ही में add_link_options
ब्रूस एडम्स

46

CMAKE_CXX_FLAGSइसके बजाय चर सेट करने का प्रयास करें CMAKE_C_FLAGS:

set (CMAKE_CXX_FLAGS "-fexceptions")

चर CMAKE_C_FLAGS केवल C संकलक को प्रभावित करता है, लेकिन आप C ++ कोड संकलित कर रहे हैं।

ध्वज को जोड़ना CMAKE_EXE_LINKER_FLAGSनिरर्थक है।


मैंने कोशिश की है कि लेकिन यह अभी भी त्रुटि देता है। संकलक को निर्दिष्ट करने का एकमात्र तरीका सेट (CMAKE_CXX_FLAGS "-fexception") है।
सोल्टी

3
मैंने समस्या को हल किया, लेकिन एक अच्छे तरीके से नहीं, एक खराब समाधान के रूप में .. मैंने बनाया -DCMAKE_CXX_FLAGS = "-fexception" कमांड लाइन में। किसी कारण से cmake .cmake फ़ाइल से झंडे नहीं पढ़ रहा है। :( .. धन्यवाद आपके उत्तर के लिए साकारा ..
सॉल्टी

8
-DCMAKE_CXX_FLAGS = "-fexception" = और "के बीच कोई स्थान नहीं होना चाहिए
evandrix 8

आपने जो कहा है उसके बारे में: "किसी कारण से cmake .cmake फ़ाइल से झंडे नहीं पढ़ रहा है।" सुनिश्चित करें कि आपने मौजूदा कैश को साफ़ कर दिया है। इसे फिर से cmake से पहले बिल्ड डायरेक्टरी से हटाकर सब कुछ किया जा सकता है।
ज़ैजिन

1

आप LINK_FLAGSसंपत्ति का उपयोग करके किसी विशिष्ट लक्ष्य से लिंकर फ़्लैग भी जोड़ सकते हैं:

set_property(TARGET ${target} APPEND_STRING PROPERTY LINK_FLAGS " ${flag}")

यदि आप इस परिवर्तन को अन्य लक्ष्यों के लिए प्रचारित करना चाहते हैं, तो आप लिंक करने के लिए एक डमी लक्ष्य बना सकते हैं।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.