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


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.