विषय पर बढ़ें

अंतिम अद्यतन:2026-10-12

CMake की शुरुआत और व्यवहार

CMake के सामान्य आवश्यक तत्व (भाग एक)

1. कंपाइलर flags सेट करना

उदाहरण के लिए: C++ standard सेट करना, सभी warnings दिखाना।

set(CMAKE_CXX_FLAGS "-std=c++0x -Wall")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x -Wall")
add_compile_options("$<$<STREQUAL:$<TARGET_PROPERTY:LINKER_LANGUAGE>,CXX>:-std=c++11>")

कुछ optimization flags भी सेट किए जा सकते हैं

आधिकारिक सामग्री: https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

उदाहरण:

-O0, -O1, -O2, -O3

अगर llvm का उपयोग कर रहे हैं, तो यहाँ देखें:

https://clang.llvm.org/docs/DiagnosticsReference.html

2. सोर्स फ़ाइल की properties सेट करना

यह CMake की एक जटिल property है, अगर कई targets मौजूद हैं, तो हो सकता है कि आपको किसी एक target के कुछ व्यवहार बदलने की ज़रूरत पड़े। उदाहरण के लिए, अगर आप main.cpp को C++11 से बिल्ड करना चाहते हैं, लेकिन केवल लाइब्रेरी के लिए इसे C++14 से बिल्ड करना चाहते हैं, तो ऐसी स्थिति में आप set_source_files_properties कमांड का उपयोग करके किसी विशेष सोर्स फ़ाइल की properties कॉन्फ़िगर कर सकते हैं, जैसा नीचे दिखाया गया है:

cmakeCopy code
set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/*.cpp PROPERTIES COMPILE_FLAGS "-std=c++11")

बड़ी संख्या में properties निम्न manual से देखी जा सकती हैं, हर property का उपयोग आपकी विशेष ज़रूरतों को पूरा करने के लिए किया जा सकता है।

https://cmake.org/cmake/help/v3.3/manual/cmake-properties.7.html#source-file-properties

3. लिंकर flags

निम्नलिखित GNU GCC लिंकर के लिंकर flags की सूची है।

GNU GCC लिंक विकल्प

https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html

GCC लिंकर डिफ़ॉल्ट रूप से environment variables में परिभाषित डायरेक्टरीज़ (/usr/lib;/usr/local/lib) में खोज कर सकता है, और फिर डिफ़ॉल्ट रूप से standard लाइब्रेरीज़ लिंक करता है।

सबसे आम flags में से एक -l है, जिसका उपयोग ज़रूरी लाइब्रेरीज़ लिंक करने के लिए किया जाता है, जैसे -lzlib, -lboost आदि।

ऐसे अन्य अतिरिक्त flags भी हैं जो executable के लिंकिंग विकल्पों के व्यवहार को बदलने में आपकी मदद करते हैं।

निम्नलिखित variables हैं जिनमें आप लिंकर flags जोड़ सकते हैं:

  • CMAKE_EXE_LINKER_FLAGS: executable बनाते समय लिंकर द्वारा उपयोग किए जाने वाले flags
  • CMAKE_EXE_LINKER_FLAGS_RELEASE: release संस्करण का executable बनाते समय लिंकर द्वारा उपयोग किए जाने वाले flags
  • CMAKE_EXE_LINKER_FLAGS_DEBUG: debug संस्करण का executable बनाते समय लिंकर द्वारा उपयोग किए जाने वाले flags
  • CMAKE_STATIC_LINKER_FLAGS: static लाइब्रेरी (.a, .lib) बनाते समय लिंकर द्वारा उपयोग किए जाने वाले flags
  • CMAKE_SHARED_LINKER_FLAGS: shared लाइब्रेरी (.so, .dll) बनाते समय लिंकर द्वारा उपयोग किए जाने वाले flags
  • CMAKE_MODULE_LINKER_FLAGS: module लाइब्रेरी बनाते समय लिंकर द्वारा उपयोग किए जाने वाले flags

उदाहरण के लिए, आप निम्न कोड से लिंकर flags जोड़ सकते हैं:

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl")

इन flags के उपयोग को समझना आपको executable के लिंकिंग व्यवहार पर बेहतर नियंत्रण दिलाने में मदद करता है।

4. Debug और Release पैकेज

CMakeLists.txt फ़ाइल के अंदर CMAKE_BUILD_TYPE को access किया जा सकता है। आप CMakeLists.txt में build type की जांच आसानी से कर सकते हैं:

if(${CMAKE_BUILD_TYPE} MATCHES Debug)
    message("Debug Build")
elseif(${CMAKE_BUILD_TYPE} MATCHES Release)
    message("Release Build")
endif()

आप पिछले section में दिखाए गए configuration variables का उपयोग करके अलग-अलग build types के लिए compiler और लिंकर flags सेट कर सकते हैं:

  • CMAKE_EXE_LINKER_FLAGS_RELEASE: release संस्करण का executable बनाने के लिए flags
  • CMAKE_EXE_LINKER_FLAGS_DEBUG: debug संस्करण का executable बनाने के लिए flags
  • CMAKE_CXX_FLAGS_RELEASE
  • CMAKE_CXX_FLAGS_DEBUG

संबंधित विषय

टिप्पणियाँ