সিএমকেকের মাধ্যমে প্রিপ্রোসেসর ম্যাক্রো সংজ্ঞায়িত করবেন?


283

আমি কীভাবে সিএমকেকের মাধ্যমে প্রিপ্রোসেসর ভেরিয়েবল সংজ্ঞায়িত করব?

সমমানের কোড হবে #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। সিএমকে হ'ল এমন এক জঞ্জাল সিস্টেম, তবে তারা শেষ পর্যন্ত কিছুটা বিচক্ষণতার সন্ধান করছে।

সংকলক পতাকাগুলির জন্য কোন আদেশগুলি ব্যবহার করতে হবে সে সম্পর্কে আরও ব্যাখ্যা সন্ধান করুন: https://cmake.org/cmake/help/latest/command/add_definitions.html

তেমনি, জিম হুঞ্জিকারের উত্তরে বর্ণিত হিসাবে আপনি প্রতি লক্ষ্যটি এটি করতে পারেন।


4
লিঙ্কযুক্ত পৃষ্ঠা থেকে: "দ্রষ্টব্য এই আদেশটি বিকল্প দ্বারা বাতিল করা হয়েছে: প্রিপ্রসেসর সংজ্ঞা যুক্ত করতে add_compile_definitions () ব্যবহার করুন" " সম্ভবত এই উত্তরের একটি সম্পাদনা দরকার?
এম হার্জক্যাম্প

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>)পরিবর্তে ব্যবহার করতে হবে।
কোড_ড্রেড

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)

আপনার তৈরি করা একাধিক টার্গেট থাকলে আপনার এটি করা উচিত এবং আপনি চান না যে সেগুলি সমস্ত একই পতাকা ব্যবহার করবে। টার্গেট_কম্পাইল_ডিফাইনিশনে সরকারী ডকুমেন্টেশনও দেখুন ।


1
@ জিমহানজিকার কীভাবে target_compile_definitions(my_target PRIVATE FOO=1)আলাদা set_source_files_properties(foo.cpp PROPERTIES COMPILE_DEFINITIONS -DFOO=1)?
জন স্ট্রুড

1
@ জনস্ট্র্রুড পার্থক্যটি স্কোপ পর্যায়ে রয়েছে। target_compile_definitionsWHOLE এক্সিকিউটেবল / লাইব্রেরির জন্য মান সেট করে, যেখানে 'set_source_files_properties` হিসাবে কেবলমাত্র নির্দিষ্ট ফাইলের জন্য মান সেট করে। ল্যাটার কমান্ড ফাইলগুলিকে একটি ভিন্ন ভাষা ব্যবহার করে সংকলন করার অনুমতি দেয়; অর্থাৎ, set_source_files_properties(compile_me_as_objc.c PROPERTIES -x objective-c। মনে রাখবেন যে -x objective-cএখানে জিসিসি / কলংয়ের জন্য নির্দিষ্ট একটি পতাকা রয়েছে।
জুলিয়ান কির্চ

20

অন্যান্য সমাধান এই পৃষ্ঠাতে প্রস্তাবিত দরকারী Cmake কিছু সংস্করণ <3.3.2 । এখানে আমি যে সংস্করণটি ব্যবহার করছি তার সমাধান (যেমন, 3.3.2)। আপনার কামেকের সংস্করণটি পরীক্ষা করে দেখুন $ 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
আমি যখন উত্তরটি লিখেছিলাম তখন আমি অন্যান্য সমাধানটি চেষ্টা করেছিলাম কিন্তু তাদের কেউই কাজ করছে না।
লিওস 313

@ স্পয়ারসেকিটলস, অন্য উত্তরটির সমাধান সঠিকভাবে কাজ করে না এমন কোনও ধারণা? আমি চেষ্টা করে দেখলে সিএমকে ত্রুটি দিন
Leos313

1
যদি আপনি সিএমকে ৩.৩.২ ব্যবহার করছেন, যেমন আপনি নিজের উত্তরে নির্দেশ করেছেন, আপনাকে ব্যবহার করতে হবে add_definitions()বা target_compile_definitions()। আরও আধুনিক কমান্ড, add_compile_definitions()সিএমকেক ৩.১২ অবধি যোগ করা হয়নি। @ লিওস 313
স্কোয়ারসকিটলস

1
@ স্প্যারেসকিটলস, আমি উত্তরটি আপডেট করছি, আমি কিছু পর্বত আগে যা লিখেছিলাম তা পুনরায় লিখছি। এটি নির্দেশ করার জন্য আপনাকে ধন্যবাদ
লিওস 313
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.