সিএমএক ব্যবহার করে সিএফএলএগএস এবং সিএক্সএক্সএফএলএজিএস বিকল্পগুলি সেট করুন


90

আমি কেবল লিনাক্সে চলমান কিছু কোড ডিবাগ করতে চাই এবং আমার একটি ডিবাগ বিল্ড ( -O0 -ggdb) দরকার। তাই আমি এই জিনিসগুলিকে আমার সাথে যুক্ত করেছি CMakeLists.txt:

set(CMAKE_BUILD_TYPE DEBUG)
set(CMAKE_C_FLAGS "-O0 -ggdb")
set(CMAKE_C_FLAGS_DEBUG "-O0 -ggdb")
set(CMAKE_C_FLAGS_RELEASE "-O0 -ggdb")
set(CMAKE_CXX_FLAGS "-O0 -ggdb")
set(CMAKE_CXX_FLAGS_DEBUG "-O0 -ggdb")
set(CMAKE_CXX_FLAGS_RELEASE "-O0 -ggdb")

আমি যখন সংকলনের চেষ্টা করলাম তখন আমি ভার্বোজটি ব্যবহার করতে শুরু make VERBOSE=1 করলাম এবং আমি এই ফলাফলটি পর্যবেক্ষণ করলাম

... /usr/bin/c++ -D_BSD_SOURCE **-O0 -ggdb** -Wnon-virtual-dtor 
-Wno-long-long -ansi -Wundef -Wcast-align -Wchar-subscripts -Wall -W 
-Wpointer-arith -Wformat-security -fno-exceptions -DQT_NO_EXCEPTIONS 
-fno-check-new -fno-common -Woverloaded-virtual -fno-threadsafe-statics 
-fvisibility=hidden -fvisibility-inlines-hidden **-g -O2** 
-fno-reorder-blocks -fno-schedule-insns -fno-inline ...

স্পষ্টতই কোডটি সংকলিত "-g -O2"এবং এটি আমি চাই না। আমি কীভাবে এটি ব্যবহার করতে বাধ্য করতে পারি "-O0 -ggdb"?


4
আপনি যদি একটি ডিবাগযোগ্য বিল্ড চান তবে কমান্ড লাইনে একটি ডিবাগ কনফিগার করুন। "cmake-DCMAKE_BUILD_TYPE = ডিবাগ"। ফলস্বরূপ বিল্ডটিতে প্রদত্ত বিল্ড সিস্টেমের জন্য ডিবাগ পতাকাগুলি থাকবে। Cmake ফাইল নিজেই পরিবর্তন করার কোন কারণ নেই। আপনি অন্য -D তর্ক দিয়ে CMAKE_C_FLAGS মান প্রেরণ করতে পারেন।
আতিফম

উত্তর:


84

আপনি পতাকার সেট করতে হবে পরেproject আপনার CMakeLists.txt কমান্ড।

এছাড়াও, আপনি যদি ফোন করছেন include(${QT_USE_FILE})বা add_definitions(${QT_DEFINITIONS}), আপনার এই setআদেশগুলি Qt এর পরে অন্তর্ভুক্ত করা উচিত কারণ এগুলি আরও পতাকা যুক্ত করে। যদি এটি হয় তবে আপনি সম্ভবত আপনার পতাকাগুলি Qt টিতে যুক্ত করতে চান, তাই উদাহরণস্বরূপ পরিবর্তন করুন

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -ggdb")

প্রকল্প কমান্ডের পরে আমি এই পতাকাগুলি রেখেছি। কিন্তু আউটপুট একই।
majie

আমি কেবল QT_NO_EXCEPTIONSআপনার পতাকাগুলিতে লক্ষ্য করেছি, তাই আমি আমার উত্তরটি কিছুটা বাড়িয়েছি। আমি অনুমান করছি যে ${QT_DEFINITIONS}এটি সংযোজন করা হয় -g -O2
ফ্রেজার

4
হ্যাঁ এই হল এটা. সেই ফেলে setকিউটি বেশী পরে কমান্ড সমস্যা solves। আপনাকে অনেক ধন্যবাদ.
majie

17

আমার পক্ষে কাজ করার সবচেয়ে সহজ সমাধানটি হ'ল:

export CFLAGS=-ggdb
export CXXFLAGS=-ggdb

সিএমকে এগুলি সমস্ত কনফিগারেশনের পতাকাগুলিতে যুক্ত করবে। কেবল সিএমকে ক্যাশে সাফ করার বিষয়টি নিশ্চিত করুন।


4
পরিবেশে পতাকাগুলি সেট করে দেওয়া আপনার সিএমকেলিস্ট.টেক্সট পরিবর্তন না করেই এটি করার একমাত্র উপায়। নোট করুন যে পরিবেশ মানটি কেবল প্রথম কনফিগারেশনেই পড়ে এবং তারপরে ক্যাশে রাখা হয়, সুতরাং আপনি যদি এটি পরিবর্তন করতে চান তবে আপনাকে সিএমকে ক্যাশে সাফ করতে হবে এবং এনএনভিতে নতুন মানগুলির সাথে কনফিগার পদক্ষেপটি পুনরায় চালাতে হবে। দস্তাবেজ: cmake.org/cmake/help/latest/envvar/CFLAGS.html cmake.org/cmake/help/latest/envvar/CXXFLAGS.html
ব্লিটার

4
এটি "সহজতম" নয়, এটি করার একমাত্র সঠিক উপায়।
স্লাভা

মাইনর ক্যাচ, যদি জেনারেটর নির্দিষ্ট বিল্ড টাইপের জন্য নির্দিষ্ট পতাকাটি কনফিগার করে (উদাহরণস্বরূপ CMAKE_CXX_FLAGS_DEBUG ইত্যাদি), তবে এটিতে অন্তর্ভুক্ত করুন CXXFLAGS(এবং এর মাধ্যমে এটি ইনজেকশন দেওয়া CMAKE_CXX_FLAGS) সংকলকটিতে বিকল্পটি পাস করার জন্য যথেষ্ট নয়। প্রতি বিল্ড টাইপ কনফিগারেশন ব্যবহারকারীর ইনপুট চেয়ে অগ্রাধিকার নেয়।
Ext3h

16

আপনাকে অবশ্যই সিএমকে সি / সিএক্সএক্স ডিফল্ট FLAGS পরিবর্তন করতে হবে।

মতে CMAKE_BUILD_TYPE={DEBUG/MINSIZEREL/RELWITHDEBINFO/RELEASE} প্রধান রাখা CMakeLists.txtএক:

সি জন্য

set(CMAKE_C_FLAGS_DEBUG "put your flags")
set(CMAKE_C_FLAGS_MINSIZEREL "put your flags")
set(CMAKE_C_FLAGS_RELWITHDEBINFO "put your flags")
set(CMAKE_C_FLAGS_RELEASE "put your flags")

সি ++ এর জন্য

set(CMAKE_CXX_FLAGS_DEBUG "put your flags")
set(CMAKE_CXX_FLAGS_MINSIZEREL "put your flags")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "put your flags")
set(CMAKE_CXX_FLAGS_RELEASE "put your flags")

এটি CMakeCache.txt এ সংজ্ঞায়িত মানগুলিকে ওভাররাইড করবে


এটি আপনার বর্তমান ক্যামাকের পতাকাগুলিকে ওভাররাইড করে। সুতরাং এটি ডিবাগিং ভাঙবে যতক্ষণ না আপনি -g পতাকাটি নিজের (জিসিসি) যোগ করেন
অ্যাক্টিভেটেক

"মডার্ন ক্যামেক" সিনট্যাক্স ব্যবহার করে কি একই ধারণা রয়েছে?
স্যান্ডবার্গ

6

ইউনিক্স সিস্টেমে, বেশ কয়েকটি প্রকল্পের জন্য, আমি এই লাইনগুলি সিএমকেলিস্ট.টেক্সটে যুক্ত করেছি এবং এটি সফলভাবে সংকলন করছিল কারণ বেস ( / usr / অন্তর্ভুক্ত ) এবং স্থানীয় অন্তর্ভুক্ত ( / usr / স্থানীয় / অন্তর্ভুক্ত ) পৃথক ডিরেক্টরিতে চলে যায়:

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I/usr/local/include -L/usr/local/lib")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I/usr/local/include")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L/usr/local/lib")

এটি সি এবং সি ++ সংকলক পতাকাগুলির জন্য পাথ এবং লিঙ্কার পতাকাগুলির জন্য সঠিক ডিরেক্টরি পাথ সহ সঠিক ডিরেক্টরি সংযোজন করে।

দ্রষ্টব্য: সি ++ সংকলক (সি ++) -ল সমর্থন করে না, তাই আমাদের CMAKE_EXE_LINKER_FLAGS ব্যবহার করতে হবে


4
পতাকার include_directoriesপরিবর্তে ব্যবহার করা কি ভাল -I?
তেজস কালে

তোমাকে অনেক ধন্যবাদ. আমি আমার লিঙ্কার পতাকাগুলি রেখেছিলাম CMAKE_CXX_FLAGS, যার ফলে সেগুলি উপেক্ষা করা হয়েছিল। এখন আমি CMAKE_EXE_LINKER_FLAGSআপনার উত্তরের ভিত্তিতে এগুলি রেখেছি , তারা ঠিকঠাক কাজ করছে।
নাহিয়ান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.