सीमेक के माध्यम से प्रीप्रोसेसर मैक्रो को परिभाषित करें?


283

मैं CMake के माध्यम से प्रीप्रोसेसर चर को कैसे परिभाषित करूं?

समतुल्य कोड होगा #define foo

जवाबों:


382

लंबे समय तक, add_definitionsइस उद्देश्य के लिए सीएमके के पास कमान थी । हालाँकि, हाल ही में कमांड को अधिक महीन दानेदार दृष्टिकोण (संकलित परिभाषाओं के लिए अलग कमांड, निर्देशिका और संकलक विकल्प शामिल हैं) द्वारा अलग किया गया है।

नया add_compile_definitions का उपयोग करके एक उदाहरण :

add_compile_definitions(OPENCV_VERSION=${OpenCV_VERSION})
add_compile_definitions(WITH_OPENCV2)

या:

add_compile_definitions(OPENCV_VERSION=${OpenCV_VERSION} WITH_OPENCV2)

इसके बारे में अच्छी बात यह है कि यह जर्जर चालबाज सीएमके के लिए जगह है add_definitions। CMake एक ऐसी जर्जर प्रणाली है, लेकिन वे अंततः कुछ पवित्रता पा रहे हैं।

अधिक जानकारी प्राप्त करें कि संकलक झंडे के लिए किन आदेशों का उपयोग करें: https://cmake.org/cmake/help/latest/command/add_definitions.html

इसी तरह, आप जिम-हन्ज़िकर के उत्तर में बताए अनुसार इस लक्ष्य को पूरा कर सकते हैं।


4
लिंक किए गए पृष्ठ से: "ध्यान दें कि यह आदेश विकल्पों द्वारा अधिगृहीत किया गया है: प्रीप्रोसेसर परिभाषाओं को जोड़ने के लिए add_compile_definitions () का उपयोग करें।" शायद इस उत्तर को संपादित करने की आवश्यकता है?
M.Herzkamp

9
Cmake में 3.10.2, add_compile_definitionsफेंकता है CMake Error at CMakeLists.txt:6 (add_compile_definitions): Unknown CMake command "add_compile_definitions".add_compile_options(-D <your-def>)इसके बजाय उपयोग करना था।
code_dredd

2
@mannyglover मुझे ऐसा नहीं लगता है, लेकिन आप संकलक झंडे सेट कर सकते हैं -D, कुछ की तर्ज पर cmake -D CMAKE_CXXFLAGS='-DDEBUG_CHESSBOARD'(परीक्षण नहीं किया गया)
ypnos

1
यह वास्तव में नया है ... वास्तव में यह अधिक आधुनिक सीएमके (> 3.11) में है। एक दर्द जिसे यह जानना बहुत मुश्किल है कि एक कमांड कब पेश किया गया था।
सैंडबर्ग

1
@ सैंडबर्ग आप अंतिम दस्तावेज़ के लिए लिंक खोल सकते हैं: https://cmake.org/cmake/help/v3.17/command/add_compile_definitions.html#command:add_compile_definitionsऔर पृष्ठ गायब होने तक संस्करण संख्या को नीचे बदलना शुरू करें। यह वह संस्करण होगा जहां यह अभी तक मौजूद नहीं है। अगली चाल में आप Whats newएक नया कमांड या फीचर खोजने के लिए अनुभाग पर जा सकते हैं । तो यह इतना कठिन नहीं है।
एंड्री

245

किसी विशिष्ट लक्ष्य के लिए ऐसा करने के लिए, आप निम्न कार्य कर सकते हैं:

target_compile_definitions(my_target PRIVATE FOO=1 BAR=1)

आपको ऐसा करना चाहिए यदि आपके पास एक से अधिक लक्ष्य हैं जो आप बना रहे हैं और आप नहीं चाहते कि वे सभी एक ही झंडे का उपयोग करें। इसके अलावा target_compile_definitions पर आधिकारिक दस्तावेज़ देखें ।


1
@JimHunziker कैसे target_compile_definitions(my_target PRIVATE FOO=1)अलग है set_source_files_properties(foo.cpp PROPERTIES COMPILE_DEFINITIONS -DFOO=1)?
जॉन स्ट्रॉड

1
@ जॉनस्ट्रोइड अंतर स्तर पर है। target_compile_definitionsव्होल निष्पादन योग्य / पुस्तकालय के लिए मान सेट करता है, जहां 'set_source_files_properties' के रूप में केवल निर्दिष्ट फ़ाइल के लिए मान सेट करता है। लैटर कमांड फ़ाइलों को एक अलग भाषा का उपयोग करके संकलित करने की अनुमति देता है; अर्थात्: set_source_files_properties(compile_me_as_objc.c PROPERTIES -x objective-c। ध्यान दें कि -x objective-cयहाँ GCC / Clang के लिए एक ध्वज विशिष्ट है।
जूलियन किर्श

20

इस पृष्ठ पर प्रस्तावित अन्य समाधान Cmake <के कुछ संस्करण3.3.2 उपयोगी हैं । यहां मैं जिस संस्करण का उपयोग कर रहा हूं उसका समाधान (यानी, 3.3.2) है। उपयोग करके अपने Cmake के संस्करण की जाँच करें $ cmake --versionऔर अपनी आवश्यकताओं के साथ उपयुक्त समाधान चुनें। Cmake प्रलेखन आधिकारिक पृष्ठ पर पाया जा सकता है।

सीएमके संस्करण 3.3.2 के साथ, बनाने के लिए

#define foo

मुझे उपयोग करने की आवश्यकता है:

add_definitions(-Dfoo)   # <--------HERE THE NEW CMAKE LINE inside CMakeLists.txt
add_executable( ....)
target_link_libraries(....)

और, इस तरह के अन्य की तरह एक पूर्वप्रक्रमक स्थूल परिभाषा है:

#define foo=5

लाइन इतनी संशोधित है:

add_definitions(-Dfoo=5)   # <--------HERE THE NEW CMAKE LINE inside CMakeLists.txt
add_executable( ....)
target_link_libraries(....)

4
प्रति प्रलेखन , इस समाधान वास्तव में पुराने, अधिक प्राचीन दृष्टिकोण है। अन्य उत्तर अधिक आधुनिक समाधान प्रदान करते हैं।
स्क्वेयरस्किटल्स

2
जब मैंने उत्तर लिखा, तो मैंने दूसरे समाधान की कोशिश की, लेकिन उनमें से कोई भी काम नहीं कर रहा था।
Leos313

@squareskittles, किसी भी विचार क्यों अन्य उत्तर का समाधान सही ढंग से काम नहीं किया? यदि मैं उन्हें
आजमाता

1
यदि आप CMake 3.3.2 का उपयोग कर रहे हैं, जैसा कि आपने अपने उत्तर में संकेत दिया है, तो आपको उपयोग करना होगा add_definitions()या target_compile_definitions()। अधिक आधुनिक कमांड, add_compile_definitions()सीएमके 3.12 तक जोड़ा नहीं गया था। @ Leos313
स्क्वेर्स्किटल्स

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