सीएमके में डिबग बनाम रिलीज


435

जीसीसी संकलित परियोजना में,

  • मैं प्रत्येक लक्ष्य प्रकार (डिबग / रिलीज़) के लिए CMake कैसे चलाऊँ?
  • मैं सीमेक का उपयोग करते हुए डीबग और सी / सी ++ झंडे को कैसे निर्दिष्ट करूं?
  • मैं कैसे व्यक्त करता हूं कि मुख्य निष्पादन योग्य के साथ g++और एक नेस्टेड लाइब्रेरी के साथ संकलित किया जाएगा gcc?

जवाबों:


657

CMake के साथ, आम तौर पर "आउट ऑफ सोर्स" बिल्ड करने की सिफारिश की जाती है । CMakeLists.txtअपनी परियोजना की जड़ में अपना बनाएँ । फिर अपनी परियोजना की जड़ से:

mkdir Release
cd Release
cmake -DCMAKE_BUILD_TYPE=Release ..
make

और Debug(फिर से अपनी परियोजना की जड़ से):

mkdir Debug
cd Debug
cmake -DCMAKE_BUILD_TYPE=Debug ..
make

Release/ Debugआपके कंपाइलर के लिए उपयुक्त झंडे जोड़ देगा। वहाँ भी हैं RelWithDebInfoऔर MinSizeRelविन्यास का निर्माण।


आप टूलकिन फ़ाइल को निर्दिष्ट करके झंडे को संशोधित / जोड़ सकते हैं जिसमें आप जोड़ सकते हैं CMAKE_C_FLAGS_DEBUGऔर CMAKE_C_FLAGS_RELEASEचर सकते हैं , जैसे:

set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wall")

अधिक जानकारी के लिए CMAKE_BUILD_TYPE देखें ।


आपके तीसरे प्रश्न के लिए, मुझे यकीन नहीं है कि आप वास्तव में क्या पूछ रहे हैं। CMake को स्वचालित रूप से अपने विभिन्न स्रोत फ़ाइलों के लिए उपयुक्त संकलक का पता लगाना और उसका उपयोग करना चाहिए।


3
आप cmake -i ..इसके बजाय भी कर सकते हैं , इसलिए सीमेक अंतःक्रियात्मक रूप से चलेगा, आपसे पूछेगा कि आप किस प्रकार का निर्माण चाहते हैं (कोई नहीं, रिलीज़, डीबग, मिनसलाइज़ेल, रिलिथिथेइनफो)।
थियागौफ़एक्स

5
-iइस त्रुटि संदेश में @thiagowfx विकल्प परिणाम The "cmake -i" wizard mode is no longer supported.:। मैं cmake का उपयोग कर रहा हूँ 3.7.1
फिलीपीन क्लेन

3
अच्छा अवलोकन। ऐसा लगता है कि यह संस्करण के बाद से हटा दिया गया था 3.0.0संदर्भ
थियागॉफ़एक्स

7
यदि आप उप-निर्देशिका बना रहे हैं तो यह स्रोत निर्माण से बाहर नहीं है! स्रोत निर्देशिका के बाहर / ऊपर निर्माण निर्देशिका बनाने की सलाह दी जाती है।
विक्टर लामोइन

ध्यान दें कि यदि CMAKE_BUILD_TYPEसेट नहीं किया गया है, तो cmake किसी भी डिफ़ॉल्ट बिल्ड प्रकार का चयन नहीं करेगा, इसलिए उत्पन्न कंपाइलर कमांड लाइन किसी भी बिल्ड कॉन्फ़िगरेशन से मेल नहीं खाएगी।
डेविड

23

डीबग / रिलीज़ फ़्लैग के लिए, CMAKE_BUILD_TYPEचर देखें (आप इसे पास करें cmake -DCMAKE_BUILD_TYPE=value)। यह मान लेता है Release, जैसे Debug, आदि।

https://gitlab.kitware.com/cmake/community/wikis/doc/cmake/Useful-Variables#compilers-and-tools

cmake संकलक को चुनने के लिए एक्सटेंशन का उपयोग करता है, इसलिए बस अपनी फ़ाइलों को नाम दें। c।

आप इसे विभिन्न सेटिंग्स के साथ ओवरराइड कर सकते हैं:

उदाहरण के लिए:

set_source_files_properties(yourfile.c LANGUAGE CXX) 

जी ++ के साथ .c फाइलें संकलित करेगा। ऊपर दिए गए लिंक से यह भी पता चलता है कि C / C ++ के लिए एक विशिष्ट कंपाइलर का चयन कैसे करें।


16

CMAKE_CXX_FLAGSसीधे स्ट्रिंग्स में हेरफेर करने के बजाय (जो कि अधिक अच्छी तरह से string(APPEND CMAKE_CXX_FLAGS_DEBUG " -g3")btw का उपयोग करके किया जा सकता है ), आप उपयोग कर सकते हैं add_compiler_options:

add_compile_options(
  "-Wall" "-Wpedantic" "-Wextra" "-fexceptions"
  "$<$<CONFIG:DEBUG>:-O0;-g3;-ggdb>"
)

यह सभी प्रकार के निर्माण के लिए निर्दिष्ट चेतावनियों को जोड़ेगा, लेकिन केवल दिए गए डिबगिंग झंडे को DEBUGनिर्माण के लिए। ध्यान दें कि संकलित विकल्प एक सीएमके सूची के रूप में संग्रहीत किए जाते हैं, जो अर्धवृत्त द्वारा अपने तत्वों को अलग करने वाला एक स्ट्रिंग है ;


2
list(APPEND CMAKE_CXX_FLAGS_DEBUG "-g3")एक अर्धविराम नहीं जोड़ेंगे -g3 से पहले कमांड को समाप्त करना और एक नया कमांड शुरू करना -g3 जो निश्चित रूप से विफल हो जाएगा?
cburn11

आप सही हैं CMAKE_CXX_FLAGSहै नहीं एक cmake सूची लेकिन अंतरिक्ष से अलग किए आदेश पंक्ति ध्वजों के एक स्ट्रिंग। मुझे वह व्यवहार असंगत लगता है ...
सेबस्टियन

add_compile_options () साफ-सुथरा है। यह add_link_options () के लिए पूरक है, जब आपको लिंकर के विकल्प जोड़ने की आवश्यकता होती है जैसे कि -fsanitize = पता।
बोवी ओवंस

1
क्या यह अभी भी 2020 / cmake 3.17 में उपयुक्त तरीका है? यह आखिरी पंक्ति बुरा लग रहा है
Jay

8

यदि आप पुनर्जनन के बिना एक अलग कॉन्फ़िगरेशन का निर्माण करना चाहते हैं यदि आप का उपयोग करके भी cmake --build {$PWD} --config <cfg>मल्टी-कॉन्फ़िगरेशन टूल चला सकते हैं , तो <cfg>पूर्व चुनें । डिबग, रिलीज़, मिनसिलेज, RelWithDebInfo

https://cmake.org/cmake/help/v2.8.11/cmake.html#opt%3a--builddir


मैंने --configबिना किसी परिणाम के विकल्प के साथ खेलने की कोशिश की है । यह $<CONFIG>चर को प्रभावित नहीं करता जैसा कि -DCMAKE_BUILD_TYPE=करता है।
लोशाद वटपक्खा

5

// CMakeLists.txt: रिलीज़

set(CMAKE_CONFIGURATION_TYPES "Release" CACHE STRING "" FORCE)

// CMakeLists.txt: डीबग

set(CMAKE_CONFIGURATION_TYPES "Debug" CACHE STRING "" FORCE)

10
मुझे समझ नहीं आ रहा है कि यह मतदान क्यों हो रहा है, यह वास्तविक कोड है जो उत्पादन में उपयोग किया जाता है, btw मुझे परवाह नहीं है।
सेलफिश009

5
हो सकता है क्योंकि CMake डॉक्स के अनुसार के लिए CMAKE_CONFIGURATION_TYPESसंभव मान शामिल हैं CMAKE_BUILD_TYPE। इसलिए आपको उत्तर को अन्य सुझावों के अनुसार सेट करना चाहिए। हो सकता है कि आपका समाधान काम करता हो क्योंकि यह आपके लिए संभावित विकल्पों को सीमित करता है।
bjhend

2
Upvote क्योंकि यह काम करेगा। मैं कुछ सीएमके से प्यार करता हूं, लेकिन झगड़े हैं और कभी-कभी आपको चीजों को काम करने के लिए बड़े हथौड़ा का उपयोग करने की आवश्यकता होती है। मेरे पास कुछ परियोजनाएं हैं जो एक या किसी अन्य कारण से कमांड लाइन के झंडे को अस्वीकार कर देंगी।
cory.todd

यहां कुछ अतिरिक्त जानकारी दी गई है कि सेटिंग काम क्यों नहीं कर सकती है: stackoverflow.com/a/24470998/3196753
tresf
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.