আমি কীভাবে সিএমকে ফাইলটিতে লিঙ্কার যুক্ত করব বা পতাকা সংকলন করব?


220

আমি arm-linux-androideabi-g++সংকলক ব্যবহার করছি । যখন আমি একটি সাধারণ "হ্যালো, ওয়ার্ল্ড!" সংকলন করার চেষ্টা করি প্রোগ্রাম এটি জরিমানা সংকলন। আমি যখন সেই কোডটিতে একটি সাধারণ ব্যতিক্রম হ্যান্ডলিং যুক্ত করে এটি পরীক্ষা করি তখন এটি যুক্ত হয় (যুক্ত করার পরে)-fexceptions .. আমি মনে করি এটি ডিফল্টরূপে অক্ষম হয়ে গেছে)।

এটি একটি অ্যান্ড্রয়েড ডিভাইসের জন্য এবং আমি কেবল সিএমকেই ব্যবহার করতে চাই, না ndk-build

উদাহরণ স্বরূপ - first.cpp

#include <iostream>

using namespace std;

int main()
{
   try
   {
   }
   catch (...)
   {
   }
   return 0;
}

./arm-linux-androideadi-g++ -o first-test first.cpp -fexceptions

এটি কোনও সমস্যা ছাড়াই কাজ করে ...

সমস্যাটি ... আমি সিএমকে ফাইল দিয়ে ফাইলটি সংকলনের চেষ্টা করছি।

আমি -fexceptionsপতাকা হিসাবে যুক্ত করতে চাই । আমি চেষ্টা করেছিলাম

set (CMAKE_EXE_LINKER_FLAGS -fexceptions ) or set (CMAKE_EXE_LINKER_FLAGS "fexceptions" )

এবং

set ( CMAKE_C_FLAGS "fexceptions")

এটি এখনও একটি ত্রুটি প্রদর্শন করে।


এই মুহূর্তে আমার একই সমস্যা হচ্ছে এবং আমি বিভিন্ন জিনিস চেষ্টা করছি। কিছুটা ঝুলে থাকি এবং আমি একটি উত্তর পোস্ট করি। সংকলন পতাকাগুলির জন্য, একটি অশুচি তবে সহজ উপায় রয়েছে: add_definitions ("- truc")
অফির্মো

এই প্রশ্নে আরও আপ-টু-ডেট আলোচনার জন্য (বিশেষত আপনি যদি সিএমকে ৩.x বা আরও নতুন ব্যবহার করছেন): সিএমকেকে সাধারণ সংকলন পতাকা স্থাপনের জন্য আধুনিক পদ্ধতিটি কী?
কমিকসান্স এসএমএস

আরপিথটি কনফিগার করার লক্ষ্যে আপনি যে লিঙ্কের পতাকাগুলি লক্ষ্য করতে চান তা যদি সেক্ষেত্রে নির্দিষ্ট সিএমকে আরপিথ কমান্ডগুলি gitlab.kitware.com/cmake/commune/wikis/doc/cmake/… দেখুন
গ্যাব্রিয়েল

উত্তর:


243

মনে করুন আপনি এই পতাকাগুলি যুক্ত করতে চান (একটি ধ্রুবক হিসাবে তাদের ঘোষণা করা আরও ভাল):

SET(GCC_COVERAGE_COMPILE_FLAGS "-fprofile-arcs -ftest-coverage")
SET(GCC_COVERAGE_LINK_FLAGS    "-lgcov")

এগুলি যুক্ত করার বিভিন্ন উপায় রয়েছে:

  1. সবচেয়ে সহজতম (পরিষ্কার নয়, তবে সহজ এবং সুবিধাজনক, এবং শুধুমাত্র একবারে পতাকা সংকলন, সি ও সি ++ জন্য কাজ করে):

    add_definitions(${GCC_COVERAGE_COMPILE_FLAGS})
  2. সংশ্লিষ্ট সিএমকে ভেরিয়েবলগুলিতে যুক্ত:

    SET(CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}")
    SET(CMAKE_EXE_LINKER_FLAGS  "${CMAKE_EXE_LINKER_FLAGS} ${GCC_COVERAGE_LINK_FLAGS}")
  3. লক্ষ্য বৈশিষ্ট্য ব্যবহার করে, সিএফ। ডক সিএমকে পতাকা টার্গেট সম্পত্তি সংকলন করে এবং লক্ষ্য নামটি জানতে হবে।

    get_target_property(TEMP ${THE_TARGET} COMPILE_FLAGS)
    if(TEMP STREQUAL "TEMP-NOTFOUND")
      SET(TEMP "") # Set to empty string
    else()
      SET(TEMP "${TEMP} ") # A space to cleanly separate from existing content
    endif()
    # Append our values
    SET(TEMP "${TEMP}${GCC_COVERAGE_COMPILE_FLAGS}" )
    set_target_properties(${THE_TARGET} PROPERTIES COMPILE_FLAGS ${TEMP} )

এখনই আমি পদ্ধতি 2 ব্যবহার করি।


4
কেন add_definitions () অশুচি?
লীনাডি_নাটিপ্যাক

14
@leinaD_natipaC: অফিসিয়াল ডকুমেন্টেশন বলছে: এই কমান্ডটি কোনও পতাকা যুক্ত করতে ব্যবহার করা যেতে পারে, তবে এটি প্রাকপ্রসেসর সংজ্ঞা যুক্ত করার উদ্দেশ্যে তৈরি করা হয়েছে । আমার মনে হয় সে কারণেই।
বেনোইট ব্লাঞ্চন

যদিও এটি স্বীকৃত উত্তর এটি সত্যই খুব পুরানো স্টাইলের সিএমএকেই দেখায়, সময় প্যারামিটারগুলি সংকলন সম্পর্কিত যে কোনও নতুন সিএমএকে কোড কীভাবে কাঠামোযুক্ত করা উচিত তার জন্য @ ভিটাউটের উত্তরটি দেখুন
হ্যারাল্ড শেইরিখ

1
string(APPEND CMAKE_EXE_LINKER_FLAGS "new_value")set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} new_value")
রক্তাক্ত

165

সিএমকের নতুন সংস্করণগুলিতে আপনি একক লক্ষ্য সহ target_compile_optionsএবং target_link_librariesযথাক্রমে (হ্যাঁ, পরবর্তীকালে লিংক বিকল্পগুলিও সেট করে) সংকলক এবং লিংক পতাকা সেট করতে পারেন :

target_compile_options(first-test PRIVATE -fexceptions)

এই পদ্ধতির সুবিধা হ'ল আপনি অন্যান্য লক্ষ্যগুলিতে বিকল্পগুলির প্রচার নিয়ন্ত্রণ করতে পারেন যা এর মাধ্যমে PUBLICএবং এর মাধ্যমে এটির উপর নির্ভর করে PRIVATE

সিএমকে ৩.১৩ হিসাবে আপনি target_link_optionsলিঙ্কার বিকল্পগুলি যুক্ত করতেও ব্যবহার করতে পারেন যা অভিপ্রায়টিকে আরও স্পষ্ট করে তোলে।


2
আমি এটি ব্যবহার করার চেষ্টা করেছি: target_compile_options(main_static PRIVATE --static)তবে এটি কার্যকর বলে মনে হচ্ছে না, কেন কোনও ধারণা কেন?
পাওয়ে এস্কজুর

2
-staticসম্ভবত একটি লিঙ্কার, সংকলক বিকল্প নয়। এটি পাস করার চেষ্টা করুন target_link_libraries
ভিটাউট

9
ওহ, target_link_librariesআমি নথির সেই অংশটি মিস করেছি: " প্রদত্ত টার্গেটের সাথে সংযোগ করার সময় ব্যবহারের জন্য লাইব্রেরি বা পতাকাগুলি নির্দিষ্ট করুন ।" ধন্যবাদ।
পাউয়ে এস্কজুর

3
সাম্প্রতিক সংযোজন: সিএমকে ৩.১৩ target_link_optionsলিঙ্কার পতাকা নির্দিষ্ট করার জন্য একটি ক্লিনার উপায় হিসাবে পরিচয় করিয়েছে । target_link_librariesআপনার ভবিষ্যতে লিঙ্কার ফ্ল্যাগগুলির জন্য ব্যবহার এড়ানো উচিত এবং target_link_optionsপরিবর্তে ব্যবহার করা উচিত।
কমিকসান্সএসএমএস

1
রয়েছে add_compile_options - দেখুন stackoverflow.com/questions/39501481/... এবং আরও সম্প্রতি add_link_options
ব্রুস অ্যাডামস

46

CMAKE_CXX_FLAGSপরিবর্তে ভেরিয়েবল সেট করার চেষ্টা করুন CMAKE_C_FLAGS:

set (CMAKE_CXX_FLAGS "-fexceptions")

পরিবর্তনশীলটি CMAKE_C_FLAGSকেবল সি সংকলককে প্রভাবিত করে তবে আপনি সি ++ কোডটি সংকলন করছেন।

পতাকা যুক্ত করা CMAKE_EXE_LINKER_FLAGSনিরর্থক।


আমি চেষ্টা করেছিলাম কিন্তু এটি এখনও ত্রুটি দেয়। সংকলক পতাকা নির্দিষ্ট করার একমাত্র উপায় (CMAKE_CXX_FLAGS "-ফ্যাক্সেশন") সেট করা আছে।
solti

3
আমি সমস্যাটি সমাধান করেছি তবে ভালভাবে এটি দুর্বল হয়ে উঠেনি .. আমি কমান্ড লাইনে-DCMAKE_CXX_FLAGS = "-আপনি" তৈরি করেছি। কিছু কারণে কমক .cmake ফাইল থেকে পতাকা পড়ছে না। :( .. আপনার উত্তরের জন্য সাকরাকে ধন্যবাদ ..
solti

8
-DCMAKE_CXX_FLAGS = "-প্রতিক্রিয়া" "= এবং" এর মধ্যে কোনও স্থান থাকা উচিত নয়
ইভানড্রিক্স

আপনি যা বলেছিলেন তা সম্পর্কে: "কিছু কারণে কমক .cmake ফাইল থেকে পতাকাগুলি পড়ছে না।" আপনি বিদ্যমান ক্যাশেটি সাফ করেছেন তা নিশ্চিত করুন। এটি আবার চূড়ান্ত করার আগে বিল্ড ডিরেক্টরি থেকে সমস্ত কিছু মুছে ফেলার মাধ্যমে করা যেতে পারে।
জায়েজেন

1

আপনি LINK_FLAGSসম্পত্তিটি ব্যবহার করে একটি নির্দিষ্ট লক্ষ্যতে লিঙ্কার পতাকাগুলি যুক্ত করতে পারেন :

set_property(TARGET ${target} APPEND_STRING PROPERTY LINK_FLAGS " ${flag}")

আপনি যদি অন্য লক্ষ্যে এই পরিবর্তনটি প্রচার করতে চান তবে আপনি লিঙ্ক করতে একটি ডামি লক্ষ্য তৈরি করতে পারেন।


0

চেকআউট ucm_add_flags এবং ucm_add_linker_flags এর ম্যাক্রো ucm (দরকারী CMake ম্যাক্রো আমার সেট থাকে) - তারা সংযোজন কম্পাইলার / linker পতাকা মোকাবেলা।

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