সিএমকে ডিবাগ বনাম রিলিজ


435

একটি জিসিসি সংকলিত প্রকল্পে,

  • আমি প্রতিটি লক্ষ্য ধরণের (ডিবাগ / প্রকাশ) জন্য সিএমকে কীভাবে চালাব?
  • আমি সিএমকে ব্যবহার করে ডিবাগ এবং সি / সি ++ পতাকাগুলি কীভাবে প্রকাশ করব?
  • আমি কীভাবে প্রকাশ করব যে মুখ্য নির্বাহী সংকলিত হবে g++এবং একটি নেস্টেড লাইব্রেরি সহ gcc?

উত্তর:


657

সিএমকে দিয়ে এটি সাধারণত "উত্সের বাইরে" বিল্ড করার পরামর্শ দেওয়া হয়CMakeLists.txtআপনার প্রকল্পের মূলে আপনার তৈরি করুন । তারপরে আপনার প্রকল্পের মূল থেকে:

mkdir Release
cd Release
cmake -DCMAKE_BUILD_TYPE=Release ..
make

এবং এর জন্য Debug(আবার আপনার প্রকল্পের মূল থেকে):

mkdir Debug
cd Debug
cmake -DCMAKE_BUILD_TYPE=Debug ..
make

Release/ Debugআপনার সংকলকটির জন্য উপযুক্ত পতাকা যুক্ত করবে। এছাড়াও আছে RelWithDebInfoএবং MinSizeRelকনফিগারেশন বিল্ড।


আপনি একটি টুলচেন ফাইল নির্দিষ্ট করে ফ্ল্যাগগুলিতে সংশোধন / যুক্ত করতে পারেন যাতে আপনি যুক্ত করতে পারেন CMAKE_C_FLAGS_DEBUGএবং CMAKE_C_FLAGS_RELEASEভেরিয়েবলগুলি, যেমন:

set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wall")

আরও তথ্যের জন্য CMAKE_BUILD_TYPE দেখুন ।


আপনার তৃতীয় প্রশ্ন হিসাবে, আমি নিশ্চিত না আপনি ঠিক কী জিজ্ঞাসা করছেন। সিএমকে আপনার আলাদা উত্স ফাইলগুলির জন্য উপযুক্তভাবে সংকলকটি সনাক্ত এবং ব্যবহার করা উচিত।


3
আপনি তার cmake -i ..পরিবর্তে এটিও করতে পারেন , সুতরাং আপনি কোন ধরণের বিল্ড চান তা জিজ্ঞাসা করে (কুমিল্লা, রিলিজ, ডিবাগ, মিনিসাইজারেল, রিলওথথইবআইএনফো) কোনভাবে ইন্টারেক্টিভভাবে চালানো হবে ma
thiagowfx

5
@thiagowfx -iএই ত্রুটি বার্তা বিকল্প ফলাফল: The "cmake -i" wizard mode is no longer supported.। আমি cmake ব্যবহার করছি 3.7.1
ফিলিপ ক্লেন

3
ভাল পর্যবেক্ষণ। সংস্করণ থেকে এটি অবচয় করা হয়েছে বলে মনে হয় 3.0.0রেফারেন্স
thiagowfx

7
আপনি যদি কোনও উপ-ডিরেক্টরি তৈরি করে থাকেন তবে এটি উত্স তৈরির বাইরে নয়! উত্স ডিরেক্টরির বাইরে / উপরে বিল্ড ডিরেক্টরি তৈরি করার পরামর্শ দেওয়া হয়।
ভিক্টর ল্যামোইন

মনে রাখবেন যে যদি CMAKE_BUILD_TYPEসেট না করা থাকে, cmake কোনও ডিফল্ট বিল্ড টাইপ পছন্দ করে না, সুতরাং উত্পন্ন কম্পাইলার কমান্ড লাইনটি কোনও বিল্ড কনফিগারেশনের সাথে মেলে না।
ডেভিড

23

ডিবাগ / রিলিজ পতাকাগুলির জন্য, CMAKE_BUILD_TYPEভেরিয়েবলটি দেখুন (আপনি এটি হিসাবে পাস করেছেন cmake -DCMAKE_BUILD_TYPE=value)। মনে হচ্ছে মান লাগে Release,Debug ইত্যাদি

https://gitlab.kitware.com/cmake/community/wikis/doc/cmake/Useful-Variables#compilers-and-tools

সিএমকে সংকলকটি চয়ন করতে এক্সটেনশনটি ব্যবহার করে, তাই কেবল আপনার ফাইলগুলির নাম .c রাখুন।

আপনি এটি বিভিন্ন সেটিংসের মাধ্যমে ওভাররাইড করতে পারেন:

উদাহরণ স্বরূপ:

set_source_files_properties(yourfile.c LANGUAGE CXX) 

জি ++ দিয়ে .c ফাইলগুলি সংকলন করবে। উপরের লিঙ্কটিতে সি / সি ++ এর জন্য একটি নির্দিষ্ট সংকলক কীভাবে নির্বাচন করতে হবে তাও দেখানো হয়েছে।


16

CMAKE_CXX_FLAGSস্ট্রিংগুলি সরাসরি পরিচালনা করার পরিবর্তে (যা string(APPEND CMAKE_CXX_FLAGS_DEBUG " -g3")বিটিডব্লু ব্যবহার করে আরও সুন্দরভাবে করা যেতে পারে ) আপনি ব্যবহার করতে পারেন add_compiler_options:

add_compile_options(
  "-Wall" "-Wpedantic" "-Wextra" "-fexceptions"
  "$<$<CONFIG:DEBUG>:-O0;-g3;-ggdb>"
)

এটি সমস্ত বিল্ড ধরণের ক্ষেত্রে নির্দিষ্ট সতর্কতা যুক্ত করবে তবে বিল্ডটিতে কেবল প্রদত্ত ডিবাগিং পতাকাগুলিই DEBUG। নোট করুন যে সংকলন বিকল্পগুলি একটি CMake তালিকা হিসাবে সঞ্চিত রয়েছে, যা কেবলমাত্র একটি স্ট্রিং যা সেমিকোলন দ্বারা এর উপাদানগুলি পৃথক করে ;


2
list(APPEND CMAKE_CXX_FLAGS_DEBUG "-g3")-G3 কমান্ডটি সমাপ্ত করে এবং একটি নতুন কমান্ড -g3 শুরু করার পূর্বে কোনও অর্ধপরিমাণ যুক্ত করবেন না যা অবশ্যই ব্যর্থ হবে?
cburn11

আপনি ঠিক CMAKE_CXX_FLAGSহয় না একটি cmake তালিকা কিন্তু শূণ্যস্থান দ্বারা বিভাজিত, কমান্ড লাইন পতাকার একটি স্ট্রিং। আমি আচরণটি বেমানান বলে মনে করি ...
সেবাস্তিয়ান

add_compile_options () ঝরঝরে। এটি অ্যাড_লিংক_পশন () দ্বারা পরিপূর্ণ হয় যখন আপনার লিঙ্কারে অপশন যুক্ত করতে হবে যেমন -fsanitize = ঠিকানার মতো।
বোভির

1
এটি কি এখনও 2020 / চেক 3.17 এ উপযুক্ত উপায়? শেষ লাইনটি দেখতে খারাপ লাগছে
জে

8

আপনি যদি পুনরায় জেনারেট না করে একটি ভিন্ন কনফিগারেশন তৈরি করতে চান তবে আপনি cmake --build {$PWD} --config <cfg>মাল্টি-কনফিগারেশন সরঞ্জামগুলির জন্যও চালাতে পারেন , নির্বাচন করুন<cfg> প্রাক্তন । ডিবাগ, রিলিজ, মিনিসাইজেল, রিলওয়েথডিবআইএনফো

https://cmake.org/cmake/help/v2.8.11/cmake.html#opt%3a--builddir


আমি --configকোনও ফলাফল ছাড়াই বিকল্পের সাথে খেলার চেষ্টা করেছি । এটি $<CONFIG>যেমন পরিবর্তনশীলকে প্রভাবিত করে না -DCMAKE_BUILD_TYPE=
লোশাদ ভিটপকাহ

5

// CMakeLists.txt: রিলিজ

set(CMAKE_CONFIGURATION_TYPES "Release" CACHE STRING "" FORCE)

// CMakeLists.txt: ডিবাগ

set(CMAKE_CONFIGURATION_TYPES "Debug" CACHE STRING "" FORCE)

10
আমি কেন বুঝতে পারছি না কেন এই ভোটে নামা হচ্ছে, এটি আসল কোড যা উত্পাদনে ব্যবহৃত হয়েছিল, বিটিডব্লু আমার যত্ন নেই।
sailfish009

5
কারণ সিএমকে অনুযায়ী ডক্সের CMAKE_CONFIGURATION_TYPESজন্য সম্ভাব্য মান রয়েছে CMAKE_BUILD_TYPE। অন্যান্য উত্তরগুলির পরামর্শ অনুসারে আপনার পরবর্তীটি সেট করা উচিত। হতে পারে আপনার সমাধানটি কাজ করে কারণ এটি আপনার পছন্দ করতে পছন্দের পক্ষে সম্ভাব্য পছন্দগুলি সীমাবদ্ধ করে।
বুধবার

2
Upvote কারণ এটি কাজ করবে। আমি আমাকে কিছু সিএমকে পছন্দ করি তবে সেখানে বিভিন্ন গোলমাল রয়েছে এবং কখনও কখনও জিনিসগুলি কাজ করতে আপনাকে বড় হাতুড়ি ব্যবহার করতে হবে। আমার কিছু প্রকল্প রয়েছে যা একটি কারণে বা অন্য কোনও কারণে কমান্ড লাইন পতাকা প্রত্যাখ্যান করবে।
cory.todd

: এখানে কেন সেটিং কাজ নাও করতে পারে উপর কিছু অতিরিক্ত তথ্য এর stackoverflow.com/a/24470998/3196753
tresf
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.