जवाबों:
लंबे समय तक, 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
इसी तरह, आप जिम-हन्ज़िकर के उत्तर में बताए अनुसार इस लक्ष्य को पूरा कर सकते हैं।
add_compile_definitionsफेंकता है CMake Error at CMakeLists.txt:6 (add_compile_definitions): Unknown CMake command "add_compile_definitions".। add_compile_options(-D <your-def>)इसके बजाय उपयोग करना था।
cmake -D CMAKE_CXXFLAGS='-DDEBUG_CHESSBOARD'(परीक्षण नहीं किया गया)
https://cmake.org/cmake/help/v3.17/command/add_compile_definitions.html#command:add_compile_definitionsऔर पृष्ठ गायब होने तक संस्करण संख्या को नीचे बदलना शुरू करें। यह वह संस्करण होगा जहां यह अभी तक मौजूद नहीं है। अगली चाल में आप Whats newएक नया कमांड या फीचर खोजने के लिए अनुभाग पर जा सकते हैं । तो यह इतना कठिन नहीं है।
किसी विशिष्ट लक्ष्य के लिए ऐसा करने के लिए, आप निम्न कार्य कर सकते हैं:
target_compile_definitions(my_target PRIVATE FOO=1 BAR=1)
आपको ऐसा करना चाहिए यदि आपके पास एक से अधिक लक्ष्य हैं जो आप बना रहे हैं और आप नहीं चाहते कि वे सभी एक ही झंडे का उपयोग करें। इसके अलावा target_compile_definitions पर आधिकारिक दस्तावेज़ देखें ।
target_compile_definitions(my_target PRIVATE FOO=1)अलग है set_source_files_properties(foo.cpp PROPERTIES COMPILE_DEFINITIONS -DFOO=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 के लिए एक ध्वज विशिष्ट है।
इस पृष्ठ पर प्रस्तावित अन्य समाधान 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(....)
add_definitions()या target_compile_definitions()। अधिक आधुनिक कमांड, add_compile_definitions()सीएमके 3.12 तक जोड़ा नहीं गया था। @ Leos313