সিএমকেক ব্যবহার করে কীভাবে অপ্টিমাইজেশন -O0 ছাড়াই সংকলন করবেন


17

আমি সায়েন্টিফিক লিনাক্স (এসএল) ব্যবহার করছি । আমি এমন একটি প্রকল্প সংকলন করার চেষ্টা করছি যা সি ++ (.cpp) ফাইলের গুচ্ছ ব্যবহার করে।

ডিরেক্টরিতে user/project/Build, আমি makeসমস্ত .cpp ফাইল সংকলন করতে এবং লিঙ্ক করতে প্রবেশ করি । আমি তখন যেতে হবে user/run/এবং তারপর টাইপ করতে হবে./run.sh values.txt

জিডিবি দিয়ে ডিবাগ করতে, আমাকে যেতে হবে user/runএবং তারপরে টাইপ gdb ../project/Build/bin/Projectকরে চালাতে হবে, আমি প্রবেশ করলাম run -Project INPUT/inputfile.txt। তবে আমি ব্যবহার করে ভেরিয়েবলের মান মুদ্রণ করার চেষ্টা করছি p variablename

যাইহোক, আমি বার্তা পেতে s1 = <value optimized out>। আমি অনলাইনে কিছু গবেষণা করেছি এবং মনে হচ্ছে এটি -O0সমাধান করার জন্য অপ্টিমাইজেশন ছাড়াই আমার সংকলন করা দরকার । তবে আমি কোথায় প্রবেশ করব? এ CMakeLists? যদি তা হয় তবে কোন সিএমকেলিস্ট? এক project/Buildনাকি project/src/project?


আপনি কি বিল্ড টাইপটি ডিইবিইউজে সেট করে আবার সাধারণভাবে চালানোর চেষ্টা করেছেন? যেমন (বিল্ড ডিরেক্টরি থেকে)cmake -DCMAKE_BUILD_TYPE=DEBUG ..
স্টিল্ড্রাইভার

1
কেন স্ট্যাক ওভারফ্লোতে পোস্ট করা হয়নি?
পিটার মর্টেনসেন

উত্তর:


10

চিপের উত্তরটি সহায়ক ছিল, তবে যেহেতু SETলাইনটি ওভাররোট করে তখন CMAKE_CXX_FLAGS_DEBUGএটি -gডিফল্টটিকে সরিয়ে দেয় যা আমার এক্সিকিউটেবলকে ডিবাগ তথ্য ছাড়াই নির্মিত হতে পারে। ডিবাগিং তথ্য এবং -O0 অপ্টিমাইজেশান (সিএমকে সংস্করণ ২.৮.১২.২) সহ একটি এক্সিকিউটেবল বিল্ট পাওয়ার জন্য প্রকল্প উত্স ডিরেক্টরিতে সিএমকেলিস্ট.টিএসটিএসটিতে আমার একটি ছোট অতিরিক্ত পরিবর্তন করা দরকার ।

সক্ষম করার জন্য -O0এবং ছেড়ে দেওয়ার জন্য আমি সিএমকেলিস্ট.টেক্সটে নিম্নলিখিতটি যুক্ত করেছি -g:

# Add -O0 to remove optimizations when using gcc
IF(CMAKE_COMPILER_IS_GNUCC)
    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0")
    set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0")
ENDIF(CMAKE_COMPILER_IS_GNUCC)

এটি -O0সিএমকে দ্বারা ডিবাগের জন্য ইতিমধ্যে ব্যবহৃত পতাকাগুলিতে অপ্টিমাইজেশন যুক্ত করেছে এবং আপনি যদি কোনও ক্রস প্ল্যাটফর্ম প্রকল্প ব্যবহার করে থাকেন তবে কেবলমাত্র জিসিসি বিল্ডগুলির জন্য অন্তর্ভুক্ত রয়েছে।


8

বা প্রার্থনার সময়:

cmake -DCMAKE_BUILD_TYPE=DEBUG \
      -DCMAKE_C_FLAGS_DEBUG="-g -O0" \
      -DCMAKE_CXX_FLAGS_DEBUG="-g -O0"

এবং তারপরে নিশ্চিত করুন:

make VERBOSE=1

জিসিসি বিল্ড কমান্ডগুলি এখানে বর্ণিত হিসাবে দেখানোর জন্য: /programming/

উবুন্টু 17.04, সিএমকে 3.7.2 এ পরীক্ষিত।


4

এটি CMakeLists.txt এ যুক্ত করুন (প্রকল্প উত্স ডিরেক্টরিতে একটি; বিল্ড ডিরেক্টরিতে কোনও কিছুই স্পর্শ করবেন না):

SET(CMAKE_CXX_FLAGS_DEBUG "-O0")
SET(CMAKE_C_FLAGS_DEBUG "-O0")

এবং তারপর

$ cmake -DCMAKE_BUILD_TYPE=Debug

কাজ করবে. বিকল্পভাবে কেবল এটি CMakeLists.txt- এ যুক্ত করুন

SET(CMAKE_CXX_FLAGS "-O0")
SET(CMAKE_C_FLAGS "-O0")
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.