সিএমকে দিয়ে ডিরেক্টরিগুলি কীভাবে যুক্ত করতে হবে


243

প্রায় এক বছর আগে আমি সিএমকে হেডার নির্ভরতা সম্পর্কে জিজ্ঞাসা করেছি

আমি বুঝতে পেরেছি যে সমস্যাটি দেখে মনে হয়েছিল যে সিএমকে এই হেডার ফাইলগুলিকে প্রকল্পের বাহ্যিক মনে করেছে। কমপক্ষে, একটি কোড তৈরি করার সময় :: ব্লকস প্রকল্পটি শিরোনামের ফাইলগুলি প্রকল্পের মধ্যে উপস্থিত হয় না (উত্স ফাইলগুলি করে)। সুতরাং এটি আমার কাছে মনে হয় যে সিএমকে এই শিরোলেখগুলি প্রকল্পের বাহ্যিক বলে মনে করে এবং নির্ভরতার মধ্যে সেগুলি ট্র্যাক করে না।

সিএমকে টিউটোরিয়ালের একটি দ্রুত অনুসন্ধান কেবলমাত্র তাতে ইঙ্গিত করেছে include_directoriesযা আমার ইচ্ছে মতো করছে বলে মনে হচ্ছে না ...

কোনও নির্দিষ্ট ডিরেক্টরিতে শিরোনাম অন্তর্ভুক্ত করার জন্য সিএমকে সিগন্যাল করার সঠিক উপায় কী এবং সেই শিরোনামটি জেনারেটেড মেকফাইলে ট্র্যাক করা উচিত?


এই প্রশ্নের সম্পাদনাগুলি বিভ্রান্তিকর করে তোলে। মূল প্রশ্ন এবং উত্তরগুলি হ'ল আইডিইতে শিরোলেখ ফাইলগুলি কীভাবে ট্র্যাক করা যায়। এটি উত্পন্ন মেকফিলের অনুপস্থিত শিরোলেখ ফাইলের নির্ভরতা এবং কীভাবে এই সমস্যাটি সমাধান করা যায় তার থেকে বেশ আলাদা।
fdk1342

@ ফ্রেড: আপনি কী বলছেন তা আমার কোনও ধারণা নেই। সম্পাদনা সংশোধনটি স্পষ্টভাবে দেখায় যে, সর্বশেষ বাক্যটি সর্বদা ছিল। এই প্রশ্নে কেবল প্রসাধনী সম্পাদনা করা হয়েছিল এবং কোনও শব্দই চালু করা হয়নি (বা সরানো হয়েছে)।
ম্যাথিউ এম।

তাহলে সেটাই আমার ভুল বোঝাবুঝি। এটি আমার কাছে পছন্দ হয়েছে এমন একটি সম্পূর্ণ অনুচ্ছেদ যুক্ত হয়েছিল। stackoverflow.com/questions/13703647/… বলছেন যে সাধারণ ধারণাটি ছিল আইডিইতে শিরোলেখ ফাইলটি কীভাবে তালিকাভুক্ত করা যায়। এটি .cbpপ্রকল্প ফাইল উল্লেখ করা হত । এখন যদি কম্কের নির্ভরতা স্ক্যানার কোনও মেকফিলের জন্য নির্ভরতা হিসাবে শিরোনামের ফাইলটি সঠিকভাবে সনাক্ত করতে ব্যর্থ হয় তবে এটি ঠিক করার উপায় রয়েছে তবে কিছু ক্ষেত্রে এটি ভুল হয়ে যাবে কারণ এতে একটি সম্পূর্ণ প্রিপ্রোসেসর অন্তর্ভুক্ত নেই।
fdk1342

উত্তর:


267

দুটি কাজ অবশ্যই করতে হবে।

প্রথমে অন্তর্ভুক্ত ডিরেক্টরিটি যুক্ত করুন:

target_include_directories(test PRIVATE ${YOUR_DIRECTORY})

যদি আপনি সমর্থন না করে খুব পুরানো সিএমকে সংস্করণ (২.৮.১০ বা তার বেশি) সাথে আটকে থাকেন target_include_directoriesতবে এর include_directoriesপরিবর্তে আপনি উত্তরাধিকারটিও ব্যবহার করতে পারেন :

include_directories(${YOUR_DIRECTORY})

তারপরে আপনাকে অবশ্যই বর্তমান টার্গেটের জন্য আপনার উত্স ফাইলগুলির তালিকায় শিরোনাম ফাইলগুলি যুক্ত করতে হবে:

set(SOURCES file.cpp file2.cpp ${YOUR_DIRECTORY}/file1.h ${YOUR_DIRECTORY}/file2.h)
add_executable(test ${SOURCES})

এইভাবে, শিরোনাম ফাইলগুলি মেকফাইলে নির্ভরতা হিসাবে উপস্থিত হবে এবং উদাহরণস্বরূপ উত্পন্ন ভিজ্যুয়াল স্টুডিও প্রকল্পে, যদি আপনি একটি উত্পন্ন করেন।

কয়েকটি লক্ষ্যবস্তুর জন্য কীভাবে সেই শিরোলেখ ফাইলগুলি ব্যবহার করবেন:

set(HEADER_FILES ${YOUR_DIRECTORY}/file1.h ${YOUR_DIRECTORY}/file2.h)

add_library(mylib libsrc.cpp ${HEADER_FILES})
target_include_directories(mylib PRIVATE ${YOUR_DIRECTORY})
add_executable(myexec execfile.cpp ${HEADER_FILES})
target_include_directories(myexec PRIVATE ${YOUR_DIRECTORY})

আহ! আমি জানতাম এটি কিছু বোকা হতে হবে। প্রকৃতপক্ষে, আমি শিরোনামগুলি তালিকাভুক্ত করিনি ... আমাকে কি কেবল এই লাইব্রেরির শিরোনামগুলি বা এটির উপর নির্ভর করতে পারে এমন সমস্ত শিরোনামের তালিকা তৈরি করতে হবে (গ্রন্থাগারের উপর নির্ভরতা ঘোষণার শীর্ষে)? এটি একটি ক্রমবর্ধমান প্রকল্প এবং আমি যখন রুট লাইব্রেরিতে একটি যুক্ত করি তখন সমস্ত নির্ভরতাগুলিতে একটি শিরোনাম যুক্ত করার ধারণাটি আমি যথেষ্ট ভয় পাই।
ম্যাথিউ এম।

উন্নত নির্ভরতা ট্র্যাকিংয়ের জন্য অনুমতি দেওয়ার জন্য (উদাহরণস্বরূপ নিশ্চিত করুন যে শিরোনাম ফাইলটি সংশোধন করা সমস্ত আক্রান্ত লক্ষ্যবস্তুগুলির জন্য সংকলনকে ট্রিগার করে) yes তবে আপনি একবারে শিরোনামের ফাইলগুলির তালিকা তৈরি করতে cmake ভেরিয়েবলগুলি ব্যবহার করতে পারেন এবং কয়েকটি স্থানে ব্যবহার করতে পারেন, আমার সম্পাদনা দেখুন।
স্যারডিয়ারিয়াস

1
আমার প্রশ্নটি এই অর্থে আরও ছিল যে আমার বেশ কয়েকটি গ্রন্থাগার রয়েছে যা একে অপরের উপর নির্ভর করে: লাইব্রুট, লিবা লাইব্রোটের উপর নির্ভর করে, লিবিব লিবারোটের উপর নির্ভর করে। আমি ব্যবহার করতে পারি LIBROOT_HEADER_FILESমধ্যে পরিবর্তনশীল liba/CMakefileএবং libb/CMakefileতারপর?
ম্যাথিউ এম।

2
এই ভুল হয়, তাহলে আপনি উচিত না ব্যবহার include_directoriesউপর target_include_directories। প্রাক্তন এটি ডিরেক্টরিতে সমস্ত লক্ষ্যগুলির জন্য এটি পুনরাবৃত্তভাবে সেট করে; যদিও পরেরটি এটি একটি লক্ষ্য নির্ধারণ করে। প্রাক্তনটি করা সিএমকে লক্ষ্যবস্তু গ্রাফের ধারণাটি ভেঙে দেয় এবং পরিবর্তে আপনার ফাইলের স্তরক্রমের পার্শ্ব প্রতিক্রিয়াগুলির উপর নির্ভর করে।
অ্যান্ডি

1
আমি উত্তরটি সম্পাদনা করে target_include_directoriesআধুনিক সিএমকে কোডের জন্য পছন্দ করার বর্তমান ধারণাকে প্রতিফলিত করেছিলাম। আপনি যদি পরিবর্তনের সাথে একমত না হন তবে আমাকে কোনও চ্যাটে আমন্ত্রণ জানাতে দ্বিধা বোধ করুন।
কমিকসান্সএসএমএস

74

প্রথমে, আপনি include_directories()সিএমকে কে -Iসংকলন কমান্ড লাইনের মধ্যে ডিরেক্টরি যুক্ত করতে বলবেন use দ্বিতীয়ত, আপনি নিজের add_executable()বা add_library()কলটিতে শিরোনামগুলি তালিকাভুক্ত করেন ।

উদাহরণস্বরূপ, যদি আপনার প্রকল্পের উত্সগুলি থাকে srcএবং আপনার কাছ থেকে শিরোনাম প্রয়োজন হয় তবে includeআপনি এটি এটি করতে পারেন:

include_directories(include)

add_executable(MyExec
  src/main.c
  src/other_source.c
  include/header1.h
  include/header2.h
)

19
আপনার কি সত্যিই শিরোনাম যুক্ত করতে হবে add_executable? আমি ভেবেছিলাম সিএমকে স্বয়ংক্রিয়ভাবে অন্তর্ভুক্ত ফাইলের নির্ভরতাগুলি খুঁজে পেয়েছেন।
কলিন ডি বেনেট

57
@ কলিনডিবেনেট নির্ভরতার কারণে আপনাকে সেগুলি তালিকাভুক্ত করতে হবে না - সিএমকে তৈরি করুন নির্ভরতা ঠিকঠাক তৈরি করুন যদি আপনি না করেন তবে ঠিক আছে। তবে আপনি যদি তাদের তালিকাভুক্ত করেন তবে এগুলি প্রকল্পের অংশ হিসাবে বিবেচিত হবে এবং আইডিইগুলিতে যেমন তালিকাভুক্ত হবে (যা ছিল প্রশ্নটির বিষয়)।
অ্যাঞ্জিউ আর

কমপক্ষে QtCretor এর জন্য ক্লাস। সিপি বিদ্যমান থাকলে Class.h যুক্ত করা প্রয়োজন নয়। উত্সে শুধুমাত্র lonely.h যুক্ত করা দরকার। Www.th-thielemann.de/cmake
Th থাইলেমান

19

মেকফাইল তৈরির অন্যান্য পদ্ধতির সাথে যেমন তুলনা করা হয় (যেমন মেক বা কিউমেক) সিএমকে হ'ল স্ক্রিপ্ট ভাষার মতো। পাইথনের মতো এটি খুব শীতল নয়, তবে এখনও।

লোকেরা কীভাবে ডিরেক্টরি অন্তর্ভুক্ত করে তা বিভিন্ন ওপেনসোর্স প্রকল্পে সন্ধান করা যদি " যথাযথ উপায় " এর মতো কোনও জিনিস নেই । তবে এটি করার দুটি উপায় আছে।

  1. অভদ্র include_directories বর্তমান প্রোজেক্ট এবং অন্যান্য সব বংশধর প্রকল্প আপনি একটি সিরিজ মাধ্যমে সংযোজন করবে করার জন্য একটি ডিরেক্টরি যোগ হবে add_subdirectory কমান্ড। কখনও কখনও লোকেরা বলে যে এই জাতীয় পদ্ধতির উত্তরাধিকার।

  2. আরও একটি মার্জিত উপায় হ'ল টার্গেট_সহ অন্তর্ভুক্ত_ ডিরেক্টরি । এটি কোনও নির্দিষ্ট প্রকল্প / টার্গেটের জন্য একটি ডিরেক্টরি সংযোজন করতে দেয় (সম্ভবত) অপ্রয়োজনীয় উত্তরাধিকার ছাড়াই বা বিভিন্ন অন্তর্ভুক্ত ডিরেক্টরিগুলির সংঘাতের জন্য। এমনকি একটি সূক্ষ্ম কনফিগারেশন সম্পাদন করার অনুমতি দিন এবং এই আদেশের জন্য নিম্নলিখিত চিহ্নিতকারীগুলির মধ্যে একটি সংযুক্ত করুন।

ব্যক্তিগত - কেবলমাত্র এই নির্দিষ্ট বিল্ড টার্গেটের জন্য ব্যবহার করুন

পাবলিক - নির্দিষ্ট লক্ষ্য এবং এই প্রকল্পের সাথে লিঙ্কযুক্ত লক্ষ্যগুলির জন্য এটি ব্যবহার করুন

ইন্টারফেস - এটি কেবলমাত্র টার্গেটের জন্য ব্যবহার করুন যা বর্তমান প্রকল্পের সাথে লিঙ্ক করে

পুনশ্চ:

  1. উভয় কমান্ডই একটি ডিরেক্টরিকে SYSTEM হিসাবে চিহ্নিত করার জন্য একটি ইঙ্গিত দেয় যাতে নির্দিষ্ট ডিরেক্টরিতে সতর্কতা থাকতে পারে তা আপনার ব্যবসা নয়।

  2. একই রকম উত্তর হ'ল অন্যান্য জোড় কমান্ডের সাথে টার্গেট_কম্পাইল_ডিফাইনিশনস / অ্যাড_ডিফাইনিশনস , টার্গেট_কম্পাইল_পশনগুলি / সিএমএকে_সি_এফএলজিএস


13

অ্যাড include_directories("/your/path/here")

এটি বিকল্প gccসহ কলিংয়ের অনুরূপ হবে -I/your/path/here/

নিশ্চিত করুন যে আপনি পথটির চারপাশে ডাবল উক্তি রেখেছেন। অন্যান্য লোকেরা এটি উল্লেখ করেনি এবং এটি আমাকে 2 দিনের জন্য আটকে রাখে। সুতরাং এই উত্তরটি এমন লোকদের জন্য যারা সিএমকেকে খুব নতুন এবং খুব বিভ্রান্ত।


7

আমারও একই সমস্যা ছিল।

আমার প্রকল্প ডিরেক্টরিটি এটির মতো ছিল:

    --project
    ---Classes
    ----Application
    -----.h and .c files
    ----OtherFolders
    --main.cpp

এবং আমি এই সমস্ত ফোল্ডারে ফাইলগুলি অন্তর্ভুক্ত করার জন্য কী ব্যবহার করেছি:

    file(GLOB source_files
            "*.h"
            "*.cpp"
            "Classes/*/*.cpp"
            "Classes/*/*.h"
    )

    add_executable(Server ${source_files})

এবং এটি পুরোপুরি কাজ করেছে।


Cmake একটি 'বিল্ড সিস্টেম জেনারেটর' এবং ফাইল গ্লোব ব্যবহার করে 'বিল্ড সিস্টেম' নয় এটি আধুনিক cmake (3.0.০ এবং উপরে সংস্করণ সহ সিএমকে) ভাল ধারণা নয় কারণ ফাইল গ্লোবগুলি 'বিল্ড' সময়ে মূল্যায়ন করা হয় এবং 'বিল্ড' নয় সিস্টেম জেনারেশন 'সময়। লিঙ্কটি দেখুন: gist.github.com/mbinna/c61dbb39bca0e4fb7d1f73b0d66a4fd1
ggulgulia
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.