CMake का उपयोग करके CFLAGS और CXXFLAGS विकल्प सेट करें


90

मैं बस लिनक्स पर चल रहे कुछ कोड को डीबग करना चाहता हूं और मुझे डीबग बिल्ड ( -O0 -ggdb) की आवश्यकता है। इसलिए मैंने इन चीजों को अपने साथ जोड़ा CMakeLists.txt:

set(CMAKE_BUILD_TYPE DEBUG)
set(CMAKE_C_FLAGS "-O0 -ggdb")
set(CMAKE_C_FLAGS_DEBUG "-O0 -ggdb")
set(CMAKE_C_FLAGS_RELEASE "-O0 -ggdb")
set(CMAKE_CXX_FLAGS "-O0 -ggdb")
set(CMAKE_CXX_FLAGS_DEBUG "-O0 -ggdb")
set(CMAKE_CXX_FLAGS_RELEASE "-O0 -ggdb")

जब मैंने संकलन करने का प्रयास किया तो मैंने प्रयोग करने पर क्रिया को बदल दिया make VERBOSE=1 और मैंने आउटपुट का अवलोकन किया, इस तरह

... /usr/bin/c++ -D_BSD_SOURCE **-O0 -ggdb** -Wnon-virtual-dtor 
-Wno-long-long -ansi -Wundef -Wcast-align -Wchar-subscripts -Wall -W 
-Wpointer-arith -Wformat-security -fno-exceptions -DQT_NO_EXCEPTIONS 
-fno-check-new -fno-common -Woverloaded-virtual -fno-threadsafe-statics 
-fvisibility=hidden -fvisibility-inlines-hidden **-g -O2** 
-fno-reorder-blocks -fno-schedule-insns -fno-inline ...

जाहिरा तौर पर कोड के साथ संकलित किया गया है "-g -O2"और यह वह नहीं है जो मैं चाहता हूं। मैं इसे "-O0 -ggdb"केवल उपयोग करने के लिए कैसे मजबूर कर सकता हूं ?


1
यदि आप एक डिबग करने योग्य बिल्ड चाहते हैं, तो बस कमांड लाइन पर डिबग कॉन्फ़िगर करें। "cmake -DCMAKE_BUILD_TYPE = डीबग"। परिणामी बिल्ड में दिए गए बिल्ड सिस्टम के लिए डीबग ध्वज होंगे। Cmake फ़ाइल को संशोधित करने का कोई कारण नहीं है। आप एक और-डी तर्क के साथ CMAKE_C_FLAGS मूल्य में भी भेज सकते हैं।
आतिफ ने

जवाबों:


84

आप झंडे निर्धारित करने की आवश्यकता के बादproject अपने CMakeLists.txt में आदेश।

इसके अलावा, यदि आप फोन कर रहे हैं include(${QT_USE_FILE})या add_definitions(${QT_DEFINITIONS}), आपको setक्यूटी वालों के बाद इन कमांड को शामिल करना चाहिए क्योंकि ये आगे के झंडे जोड़ेंगे। अगर ऐसा है , तो आप शायद Qt वाले को अपने झंडे जोड़ना चाहते हैं, इसलिए उदाहरण के लिए बदल दें

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -ggdb")

मैंने प्रोजेक्ट कमांड के बाद उन झंडों को लगा दिया। लेकिन आउटपुट एक ही है।
मझी

मैंने सिर्फ QT_NO_EXCEPTIONSआपके झंडे में ध्यान दिया है, इसलिए मैंने अपना उत्तर थोड़ा बढ़ाया है। मुझे लगता है कि ${QT_DEFINITIONS}जोड़ रहा है अनुमान लगा रहा हूँ -g -O2
फ्रेजर

1
हाँ, यह बात है। setQt वाले समस्या को हल करने के बाद उन कमांड को रखना। आपका बहुत बहुत धन्यवाद।
मजी

17

मेरे लिए सबसे आसान समाधान यह है:

export CFLAGS=-ggdb
export CXXFLAGS=-ggdb

सीएमके उन्हें सभी कॉन्फ़िगरेशन के झंडे के साथ जोड़ देगा। बस सीएमके कैश को साफ करना सुनिश्चित करें।


3
इस तरह पर्यावरण में झंडे स्थापित करना आपके CMakeLists.txt को संशोधित किए बिना इसे करने का एकमात्र तरीका है। ध्यान दें कि पर्यावरण मूल्य केवल पहले कॉन्फ़िगरेशन पर पढ़ा जाता है और फिर कैश में डाल दिया जाता है, इसलिए यदि आप इसे बदलना चाहते हैं तो आपको CMake कैश को साफ़ करना होगा और env में नए मानों के साथ कॉन्फ़िगर चरण को फिर से चलाना होगा। डॉक्स: cmake.org/cmake/help/latest/envvar/CFLAGS.html cmake.org/cmake/help/latest/envvar/CXXFLAGS.html
ब्लैटर

3
यह "सबसे आसान" नहीं है, यह करने का एकमात्र सही तरीका है।
स्लाव

माइनर कैच, यदि जनरेटर एक विशिष्ट बिल्ड प्रकार (जैसे CMAKE_CXX_FLAGS_DEBUG आदि) के लिए एक विशिष्ट ध्वज को कॉन्फ़िगर कर रहा है , तो इसे CXXFLAGS(और इस तरह इसे इंजेक्ट करना CMAKE_CXX_FLAGS) सहित वास्तव में संकलक के विकल्प को पारित करने के लिए पर्याप्त नहीं है। प्रति बिल्ड प्रकार कॉन्फ़िगरेशन उपयोगकर्ता इनपुट पर पूर्वता लेता है।
Ext3h

16

आपको cmake C / CXX डिफ़ॉल्ट FLAGS को बदलना होगा।

के अनुसार CMAKE_BUILD_TYPE={DEBUG/MINSIZEREL/RELWITHDEBINFO/RELEASE} मुख्य में डाल CMakeLists.txtमें से एक:

C के लिए

set(CMAKE_C_FLAGS_DEBUG "put your flags")
set(CMAKE_C_FLAGS_MINSIZEREL "put your flags")
set(CMAKE_C_FLAGS_RELWITHDEBINFO "put your flags")
set(CMAKE_C_FLAGS_RELEASE "put your flags")

C ++ के लिए

set(CMAKE_CXX_FLAGS_DEBUG "put your flags")
set(CMAKE_CXX_FLAGS_MINSIZEREL "put your flags")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "put your flags")
set(CMAKE_CXX_FLAGS_RELEASE "put your flags")

यह CMakeCache.txt में परिभाषित मूल्यों से आगे निकल जाएगा


जो आपके cmake फ़्लैग को ओवरराइड करता है जो करंट है। इसलिए यह डिबगिंग को तब तक तोड़ता है जब तक कि आप अपने आप से (
-जीसी

वहाँ एक ही "आधुनिक Cmake" वाक्यविन्यास का उपयोग कर लगता है?
सैंडबर्ग

6

यूनिक्स प्रणालियों पर, कई परियोजनाओं के लिए, मैंने इन पंक्तियों को CMakeLists.txt में जोड़ा और यह सफलतापूर्वक संकलित कर रहा था क्योंकि आधार ( / usr / शामिल ) और स्थानीय शामिल हैं ( / usr / स्थानीय / शामिल ) अलग निर्देशिकाओं में जाते हैं:

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I/usr/local/include -L/usr/local/lib")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I/usr/local/include")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L/usr/local/lib")

यह सही निर्देशिका को जोड़ता है, जिसमें C और C ++ संकलक झंडे के लिए पथ और लिंकर झंडे के लिए सही निर्देशिका पथ शामिल हैं।

नोट: C ++ कंपाइलर (c ++) -L का समर्थन नहीं करता है, इसलिए हमें CMAKE_EXE_LINKER_FLAGS का उपयोग करना होगा


3
क्या झंडे के include_directoriesबजाय इसका उपयोग करना बेहतर है -I?
तेजस काले

बहुत बहुत धन्यवाद। मैं अपने लिंकर झंडे लगा रहा था CMAKE_CXX_FLAGS, जिसके कारण उन्हें नजरअंदाज करना पड़ा। अब जब मैंने उन्हें CMAKE_EXE_LINKER_FLAGSआपके उत्तर के आधार पर रखा , तो वे ठीक काम कर रहे हैं।
नाहन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.