G / C ++ এর সাথে জিসিসি: কার্যকরভাবে / লাইব্রেরিতে রিসোর্স ফাইলগুলি স্থিতিশীলভাবে যুক্ত করুন


94

জিসিসি ব্যবহার করে নির্বাহযোগ্য বা ভাগ করা লাইব্রেরি ফাইলটিতে কোনও সংস্থান ফাইলটি কীভাবে স্থিতিশীলভাবে সংকলন করা যায় সে সম্পর্কে কি কারও ধারণা আছে?

উদাহরণস্বরূপ আমি ইমেজ ফাইলগুলি যুক্ত করতে চাই যা কখনই পরিবর্তন হয় না (এবং যদি তারা হয় তবে আমাকে ফাইলটি প্রতিস্থাপন করতে হবে) এবং তারা ফাইল সিস্টেমে থাকতে চান না।

যদি এটি সম্ভব হয় (এবং আমি মনে করি এটি উইন্ডোজের জন্য ভিজ্যুয়াল সি ++ এটিও করতে পারে) তবে আমি কীভাবে নিজের বাইনারিতে সঞ্চিত ফাইলগুলি লোড করব? এক্সিকিউটেবল নিজেই বিশ্লেষণ করে, ফাইলটি খুঁজে বের করে এবং এর থেকে ডেটা বের করে দেয়?

জিসিসির জন্য হয়ত একটি বিকল্প আছে যা আমি এখনও দেখিনি। অনুসন্ধান ইঞ্জিনগুলি ব্যবহার করা সত্যই সঠিক জিনিসগুলিকে ছিটকেছিল না।

ভাগ করা লাইব্রেরি এবং সাধারণ ELF- এক্সিকিউটেবলের জন্য কাজ করার জন্য আমার এটি দরকার need

কোন সাহায্য প্রশংসা করা হয়



ব্লুবেরিফিল্ডস ইঙ্গিত করা প্রশ্নে ইজজকপি লিঙ্কটিও এটির একটি ভাল, জেনেরিক সমাধান
ফ্লেক্সো

@ ব্লুবেরিফিল্ডস: নকল করার জন্য দুঃখিত তুমি ঠিক বলছো. সাধারণত আমি নকল হিসাবে কাছাকাছি ভোট দিতে হবে। তবে তারা সকলেই খুব সুন্দর উত্তর পোস্ট করেছে, আমি কেবল একটি গ্রহণ করব।
আত্মগোপনে

আমি কি যুক্ত করতে পারি যে জন রিপলির পদ্ধতিটি সম্ভবত এক বিশাল কারণের জন্য এখানে সর্বোত্তম - প্রান্তিককরণ। যদি আপনি একটি স্ট্যান্ডার্ড অবজকপি বা "ld -r -b বাইনারি -o foo.o foo.txt" করেন এবং তারপরে অবজেক্টটি-এর সাথে ফলাফলটি দেখুন তবে মনে হয় যে ব্লকের জন্য প্রান্তিককরণটি সেট করা আছে 0 যদি আপনি চান চর ছাড়া অন্য বাইনারি ডেটার জন্য সঠিক হতে পারে, আমি ভাবতে পারি না এটি একটি ভাল জিনিস।
carveone

উত্তর:


51

সঙ্গে ImageMagick :

convert file.png data.h

এরকম কিছু দেয়:

/*
  data.h (PNM).
*/
static unsigned char
  MagickImage[] =
  {
    0x50, 0x36, 0x0A, 0x23, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 
    0x77, 0x69, 0x74, 0x68, 0x20, 0x47, 0x49, 0x4D, 0x50, 0x0A, 0x32, 0x37, 
    0x37, 0x20, 0x31, 0x36, 0x32, 0x0A, 0x32, 0x35, 0x35, 0x0A, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 

....

অন্য কোড সাথে সামঞ্জস্যের জন্য তারপর আপনি পারেন ব্যবহার করতে পারেন fmemopenএকটি "নিয়মিত" পেতে FILE *বস্তু, অথবা বিকল্পভাবে std::stringstreamএকটি করতে iostreamstd::stringstreamযদিও এটির জন্য দুর্দান্ত নয় এবং আপনি অবশ্যই একটি পয়েন্টারটি যে কোনও জায়গায় ব্যবহার করতে পারেন যেখানে আপনি পুনরাবৃত্তি ব্যবহার করতে পারেন।

আপনি যদি এটি অটোমেক দিয়ে ব্যবহার করছেন তবে BUILT_SOURCES যথাযথভাবে সেট করতে ভুলবেন না ।

এটি এইভাবে করার সম্পর্কে দুর্দান্ত জিনিসটি হ'ল:

  1. আপনি পাঠ্য আউট পেয়েছেন, সুতরাং এটি সংস্করণ নিয়ন্ত্রণে এবং সংবেদনশীলভাবে প্যাচ হতে পারে
  2. এটি পোর্টেবল এবং প্রতিটি প্ল্যাটফর্মে ভালভাবে সংজ্ঞায়িত করা হয়েছে

4
ব্লেহগ! এটাই সমাধান আমি ভেবেছিলাম। কেন যে কেউ কখনই এটি করতে চায় তা আমার বাইরে। একটি ভাল-সংজ্ঞায়িত নেমস্পেসে ডেটা টুকরোগুলি সংরক্ষণ করা ফাইল ফাইলগুলি কী।
সর্বজনীন

36
মাঝে মাঝে আপনার একটি এক্সিকিউটেবল থাকে যা সেখানে চলে যেখানে যেখানে কোনও ফাইল সিস্টেম নেই, এমনকি কোনও অপারেটিং সিস্টেমও নেই। অথবা আপনার অ্যালগরিদমের জন্য লুক্কুলের জন্য কিছু পূর্বনির্ধারিত টেবিলের প্রয়োজন। এবং আমি নিশ্চিত আরো মামলা দর্শন যখন প্রোগ্রামে সংরক্ষণকারী তথ্য একটি তোলে am অনেক ইন্দ্রিয়।
ndim

16
রূপান্তরটির এই ব্যবহারটি হুবহু একইxxd -i infile.bin outfile.h
গ্রেফ্যাড

4
এই পদ্ধতির একটি নেতিবাচক দিকটি হ'ল কিছু সংকলক এই জাতীয় স্ট্যাটিক অ্যারেগুলি পরিচালনা করতে পারে না, যদি আপনার চিত্রগুলি বিশেষত বড় হয়; এটির কাছাকাছি যাওয়ার উপায়টি যেমন এনডিআইএম পরামর্শ দেয় objcopyবাইনারি ডেটা সরাসরি কোনও অবজেক্ট ফাইলে রূপান্তর করতে ব্যবহার করা; তবে এটি খুব কমই উদ্বেগের বিষয়।
অ্যাডাম রোজেনফিল্ড

4
মনে রাখবেন যে এটির শিরোনামে এটির সংজ্ঞা দেওয়ার অর্থ হ'ল এটির অন্তর্ভুক্ত প্রতিটি ফাইলের নিজস্ব অনুলিপি পাবেন। বাহ্যিক হিসাবে শিরোনামে এটি ঘোষণা করা ভাল এবং তারপরে এটি একটি সিপিসিতে সংজ্ঞায়িত করা ভাল। এখানে উদাহরণ
নিকোলাস স্মিথ

90

আপডেট আমি জন রিপলির সমাবেশ .incbinভিত্তিক সমাধান অফার নিয়ন্ত্রণকে অগ্রাধিকার দিতে বড় হয়েছি এবং এখন সেটিতে একটি বৈকল্পিক ব্যবহার করব।

এক্সিকিউটেবলের ডেটা বিভাগে কোনও ফাইল foo-data.bin থেকে বাইনারি ডেটা যুক্ত করতে আমি অবজকপি (জিএনইউ বাইনুটিস) ব্যবহার করেছি:

objcopy -B i386 -I binary -O elf32-i386 foo-data.bin foo-data.o

এটি আপনাকে একটি foo-data.oঅবজেক্ট ফাইল দেয় যা আপনি নিজের এক্সিকিউটেবলের সাথে লিঙ্ক করতে পারেন। সি ইন্টারফেসের মতো দেখতে কিছুটা

/** created from binary via objcopy */
extern uint8_t foo_data[]      asm("_binary_foo_data_bin_start");
extern uint8_t foo_data_size[] asm("_binary_foo_data_bin_size");
extern uint8_t foo_data_end[]  asm("_binary_foo_data_bin_end");

যাতে আপনি মত জিনিস করতে পারেন

for (uint8_t *byte=foo_data; byte<foo_data_end; ++byte) {
    transmit_single_byte(*byte);
}

বা

size_t foo_size = (size_t)((void *)foo_data_size);
void  *foo_copy = malloc(foo_size);
assert(foo_copy);
memcpy(foo_copy, foo_data, foo_size);

যদি আপনার টার্গেট আর্কিটেকচারটিতে ধ্রুবক এবং পরিবর্তনশীল ডেটা সংরক্ষণ করা হয় সে সম্পর্কে বিশেষ সীমাবদ্ধতা রয়েছে বা .textআপনার প্রোগ্রামের কোডের মতো একই মেমরির ধরণের ক্ষেত্রে এটি ডেটা সেগমেন্টে সঞ্চয় করতে চান তবে আপনি objcopyআরও কিছু পরামিতিগুলি খেলতে পারেন ।


ভাল ধারণা! আমার ক্ষেত্রে এটি খুব কার্যকর নয়। তবে এটি এমন একটি বিষয় যা আমি আমার স্নিপেট-সংগ্রহে রাখি। এটি ভাগ করে নেওয়ার জন্য ধন্যবাদ!
আত্মগোপনে

4
ldসেখানে আউটপুট ফর্ম্যাটটি অন্তর্ভুক্ত হওয়ায় এটি ব্যবহার করা কিছুটা সহজ , stackoverflow.com/a/4158997/201725 দেখুন
জান হুডেক

52

আপনি ldলিঙ্কার ব্যবহার করে নির্বাহযোগ্য ক্ষেত্রে বাইনারি ফাইলগুলি এম্বেড করতে পারেন । উদাহরণস্বরূপ, যদি আপনার কাছে ফাইল থাকে foo.barতবে আপনি নিম্নলিখিত আদেশগুলি এতে কার্যকর করতে এম্বেড করতে পারেনld

--format=binary foo.bar --format=default

আপনি যদি এর ldমাধ্যমে প্রার্থনা করছেন gccতবে আপনাকে যুক্ত করতে হবে-Wl

-Wl,--format=binary -Wl,foo.bar -Wl,--format=default

এখানে --format=binaryলিঙ্কারে জানায় যে নিম্নলিখিত ফাইলটি বাইনারি এবং --format=defaultডিফল্ট ইনপুট ফর্ম্যাটে ফিরে যায় (আপনি যদি অন্য ইনপুট ফাইলগুলি পরে নির্দিষ্ট করে থাকেন তবে এটি দরকারী foo.bar)।

তারপরে আপনি কোড থেকে আপনার ফাইলের বিষয়বস্তু অ্যাক্সেস করতে পারবেন:

extern uint8_t data[]     asm("_binary_foo_bar_start");
extern uint8_t data_end[] asm("_binary_foo_bar_end");

নামও রয়েছে প্রতীক "_binary_foo_bar_size"। আমি মনে করি এটি টাইপ হয়েছে uintptr_tতবে আমি এটি পরীক্ষা করে দেখিনি।


খুব আকর্ষণীয় মন্তব্য। এটি ভাগ করে নেওয়ার জন্য ধন্যবাদ!
আত্মগোপনে

4
সুন্দর! কেবল একটি প্রশ্ন: data_endএকটি অ্যারে কেন , কোনও পয়েন্টার নয়? (নাকি এই
মূর্তিমান

4
@xtofl, যদি data_endপয়েন্টার হয়ে থাকে তবে সংকলকটি ভাববে যে ফাইলের সামগ্রীর পরে পয়েন্টার রয়েছে। সিমিলারি, যদি আপনি dataকোনও পয়েন্টারে টাইপ পরিবর্তন করেন তবে আপনি ফাইলটির সূচনা বিন্দুর পরিবর্তে কোনও ফাইলের প্রথম বাইট নিয়ে পয়েন্টার পাবেন। আমি তাই মনে করি.
সাইমন

4
+1 টি: আপনার উত্তর আমাকে একটি কাস্টম জাভা লঞ্চার নির্মাণের একটি EXE মধ্যে একটি Java শ্রেণি-লোডার এবং একটি জার embbed করতে পারবেন
Aubin,

4
@xtofl - আপনি যদি এটি একটি পয়েন্টার বানাতে চলেছেন তবে এটিকে একটি করুন const pointer। সংকলক আপনাকে নন-কনস্ট্যান্ড পয়েন্টারের মান পরিবর্তন করতে দেয়, এটি যদি অ্যারে হয় তবে আপনাকে মানটি পরিবর্তন করতে দেয় না। সুতরাং অ্যারে সিনট্যাক্সটি ব্যবহার করার জন্য এটি সম্ভবত কম টাইপিং।
জেসি চিশলম

41

আপনি আপনার সমস্ত সংস্থানগুলি একটি জিপ ফাইলে রাখতে পারেন এবং এক্সিকিউটেবল ফাইলের শেষে এটি যুক্ত করতে পারেন :

g++ foo.c -o foo0
zip -r resources.zip resources/
cat foo0 resources.zip >foo

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


7
যদি আমি foo0 এবং উত্সগুলিতে যোগ দিতে চাই। Foo এ জিপ করি তবে আমার প্রয়োজন> আমি যদি বিড়ালের কমান্ড লাইনে উভয় ইনপুট দিই। (কারণ আমি ইতিমধ্যে
ফু-

4
হ্যাঁ, আমার ভুল আমার প্রথম পড়ার মাধ্যমে
নামটিতে

এটা খুব চালাক। +1
লিনাকোনিও

4
+1 আশ্চর্যজনক, বিশেষত যখন মিনিজের
এমভিপি

এটি একটি অবৈধ বাইনারি তৈরি করবে (কমপক্ষে ম্যাক এবং লিনাক্সে), যা সরঞ্জামের মাধ্যমে প্রক্রিয়া করা যায় না install_name_tool। তার পাশাপাশি, বাইনারি এখনও এক্সিকিউটেবল হিসাবে কাজ করে।
অ্যান্ডি লি

37

Http : //www.linuxj Journal.com/content/e এম্বেডিং- ফাইল- এক্সেকটেটেবল- aka- hello- world- version- 5967 থেকে :

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

এবং আছে, এটি উদ্ধারের জন্য অবজকপি। cজকপিটি অবজেক্ট ফাইল বা এক্সিকিউটেবলকে এক ফর্ম্যাট থেকে অন্য রূপান্তর করে। এটি যে ফর্ম্যাটগুলি বোঝে তার মধ্যে একটি হ'ল "বাইনারি", যা মূলত এমন কোনও ফাইল যা এটি বোঝে অন্য ফর্ম্যাটগুলির মধ্যে একটিতে নেই। সুতরাং আপনি সম্ভবত ধারণাটি কল্পনা করেছেন: যে ফাইলটিকে আমরা কোনও অবজেক্ট ফাইলে এম্বেড করতে চাই তা রূপান্তর করুন, তবে এটি কেবল আমাদের বাকী কোডের সাথে যুক্ত করা যেতে পারে।

ধরা যাক আমাদের একটি ফাইলের নাম ডেটা রয়েছে t টেক্সট যা আমরা আমাদের এক্সিকিউটেবল এম্বেড করতে চাই:

# cat data.txt
Hello world

এটিকে আমাদের প্রোগ্রামের সাথে লিঙ্ক করতে পারে এমন একটি অবজেক্ট ফাইলে রূপান্তর করতে আমরা একটি ".o" ফাইল তৈরি করতে কেবল অবজকপি ব্যবহার করি:

# objcopy --input binary \
--output elf32-i386 \
--binary-architecture i386 data.txt data.o

এটি অবজকপিটিকে বলেছে যে আমাদের ইনপুট ফাইলটি "বাইনারি" ফর্ম্যাটে রয়েছে, আমাদের আউটপুট ফাইলটি "এলএফ 32-আই 386" ফর্ম্যাটে থাকতে হবে (x86 এ অবজেক্ট ফাইলগুলি)। --Binary - আর্কিটেকচার বিকল্পটি অ্যাজবকপিটিকে বলে যে আউটপুট ফাইলটি একটি x86-তে "চালানো"। এটি প্রয়োজনীয় যাতে ld x86 এর সাথে অন্য ফাইলগুলির সাথে লিঙ্ক করার জন্য ফাইলটি গ্রহণ করবে। কেউ ভাবেন যে "elf32-i386" হিসাবে আউটপুট ফর্ম্যাটটি নির্দিষ্ট করা এটি বোঝাতে পারে, তবে তা তা নয়।

এখন যেহেতু আমাদের একটি অবজেক্ট ফাইল রয়েছে কেবলমাত্র আমরা লিঙ্কারটি চালানোর সময় এটি অন্তর্ভুক্ত করা দরকার:

# gcc main.c data.o

আমরা ফলাফলটি চালানোর সময় আমরা আউটপুটটির জন্য প্রার্থনা করি:

# ./a.out
Hello world

অবশ্যই, আমি এখনও পুরো ঘটনাটি বলিনি, বা আপনাকে দেখায়নি মেন। যখন অ্যাজজকপি উপরের রূপান্তরটি করে তখন রূপান্তরিত অবজেক্ট ফাইলে এটি "লিঙ্কার" চিহ্নগুলি যুক্ত করে:

_binary_data_txt_start
_binary_data_txt_end

লিঙ্ক করার পরে, এই চিহ্নগুলি এম্বেড করা ফাইলের শুরু এবং শেষ নির্দিষ্ট করে। প্রতীক নামগুলি বাইনারি প্রিফেন্ড করে এবং ফাইলের নাম _ স্টার্ট বা _ যুক্ত করে গঠিত হয় । যদি ফাইলের নামটিতে এমন কোনও অক্ষর থাকে যা প্রতীক নামটিতে অবৈধ হতে পারে তবে সেগুলি আন্ডারস্কোরগুলিতে রূপান্তরিত হয় (যেমন ডেটা.টিএসটিএসটি ডেটা_সেক্সট হয়ে যায়)। এই চিহ্নগুলি ব্যবহার করার সময় আপনি যদি অমীমাংসিত নামগুলি পান তবে অবজেক্ট ফাইলে একটি হেক্সডাম্প-সি করুন এবং অ্যাজজকপি যে নামগুলি চয়ন করেছেন তার জন্য ডাম্পের শেষে দেখুন।

এমবেড করা ফাইলটি ব্যবহার করার কোডটি এখন যুক্তিসঙ্গতভাবে সুস্পষ্ট হওয়া উচিত:

#include <stdio.h>

extern char _binary_data_txt_start;
extern char _binary_data_txt_end;

main()
{
    char*  p = &_binary_data_txt_start;

    while ( p != &_binary_data_txt_end ) putchar(*p++);
}

একটি গুরুত্বপূর্ণ এবং সূক্ষ্ম বিষয় লক্ষনীয় যে অবজেক্ট ফাইলে যুক্ত চিহ্নগুলি "ভেরিয়েবল" নয়। এগুলিতে কোনও ডেটা থাকে না, বরং তাদের ঠিকানাটি তাদের মান। আমি তাদের টাইপ চর হিসাবে ঘোষণা করি কারণ এটি এই উদাহরণের জন্য সুবিধাজনক: এম্বেড করা ডেটা হ'ল চরিত্রের ডেটা। যাইহোক, আপনি এগুলি কিছু হিসাবে ঘোষণা করতে পারেন, ডাটা যদি পূর্ণসংখ্যার অ্যারে হয় তবে স্ট্রাক্ট foo_bar_t যদি ডেটা foo বারগুলির কোনও অ্যারে থাকে। যদি এম্বেড করা ডেটা অভিন্ন না হয় তবে চরটি সম্ভবত সবচেয়ে সুবিধাজনক: এর ডেটাটি নিন এবং পয়েন্টারটিকে যথাযথ প্রকারে কাস্ট করুন যখন আপনি ডেটা অতিক্রম করবেন।


36

আপনি যদি সঠিক চিহ্নের নাম এবং সংস্থানসমূহের স্থাপনার উপর নিয়ন্ত্রণ রাখতে চান তবে পুরো বাইনারি ফাইলগুলি আমদানি করতে আপনি GNU এসেম্বলার (সত্যিই gcc এর অংশ নয়) ব্যবহার করতে পারেন। এটা চেষ্টা কর:

সমাবেশ (x86 / আর্ম):

    .section .rodata

    .global thing
    .type   thing, @object
    .balign 4
thing:
    .incbin "meh.bin"
thing_end:

    .global thing_size
    .type   thing_size, @object
    .balign 4
thing_size:
    .int    thing_end - thing

সি:

#include <stdio.h>

extern const char thing[];
extern const unsigned thing_size;

int main() {
  printf("%p %u\n", thing, thing_size);
  return 0;
}

আপনি যা কিছু ব্যবহার করুন না কেন, সমস্ত সংস্থান উত্পন্ন করার জন্য কোনও স্ক্রিপ্ট তৈরি করা ভাল এবং সব কিছুর জন্য সুন্দর / অভিন্ন চিহ্নের নাম থাকতে পারে।

আপনার ডেটা এবং সিস্টেমের বৈশিষ্ট্যের উপর নির্ভর করে আপনার বিভিন্ন প্রান্তিককরণ মানগুলি ( .balignপোর্টেবিলিটিটির জন্য পছন্দ সহকারে ), বা অ্যারের thing_sizeজন্য আলাদা আকারের পূর্ণসংখ্যার ধরণ বা আলাদা উপাদানের প্রকারের প্রয়োজন হতে পারে thing[]


ভাগ করে নেওয়ার জন্য ধন্যবাদ! স্পষ্টতই আকর্ষণীয় দেখায় তবে এবার আমি যা খুঁজছি তা নয় =) শ্রদ্ধা
Atmocreations

4
ঠিক আমি খুঁজছেন ছিল কি. সম্ভবত আপনি যাচাই করতে পারেন যে এটি মাপের ফাইলগুলি 4 এর দ্বারা বিচ্যুত নয় এমন ফাইলগুলির জন্যও ঠিক আছে thing
পাভেল পি

যদি আমি জিনিসটি স্থানীয় প্রতীক হতে চাই? আমি সম্ভবত আমার নিজের অ্যাসেমব্লির সাথে একসাথে সংকলক আউটপুটটি বিড়াল করতে পারি তবে এর চেয়ে আরও ভাল কোনও উপায় আছে কি?
ব্যবহারকারীর 877329

রেকর্ডের জন্য: আমার সম্পাদনাটি অতিরিক্ত পাডিং বাইটগুলি প্রকাশের বিষয়টি বিবেচনা করে যা পাভেল উল্লেখ করেছেন।
ndim

4

এখানে এবং ইন্টারনেটে সমস্ত পোস্ট পড়ে আমি এই সিদ্ধান্তে পৌঁছেছি যে সংস্থানগুলির জন্য কোনও সরঞ্জাম নেই, যা হ'ল:

1) কোড ব্যবহার করা সহজ।

2) অটোমেটেড (সহজভাবে চট্রগ্রাম / মেকের অন্তর্ভুক্ত হওয়া)।

3) ক্রস প্ল্যাটফর্ম।

আমি নিজেই এই সরঞ্জামটি লেখার সিদ্ধান্ত নিয়েছি। কোডটি এখানে উপলব্ধ। https://github.com/orex/cpp_rsc

চটকের সাহায্যে এটি ব্যবহার করা খুব সহজ।

আপনার সিএমকেলিস্টস টেক্সট ফাইলের কোডটি যুক্ত করা উচিত।

file(DOWNLOAD https://raw.github.com/orex/cpp_rsc/master/cmake/modules/cpp_resource.cmake ${CMAKE_BINARY_DIR}/cmake/modules/cpp_resource.cmake) 

set(CMAKE_MODULE_PATH ${CMAKE_BINARY_DIR}/cmake/modules)

include(cpp_resource)

find_resource_compiler()
add_resource(pt_rsc) #Add target pt_rsc
link_resource_file(pt_rsc FILE <file_name1> VARIABLE <variable_name1> [TEXT]) #Adds resource files
link_resource_file(pt_rsc FILE <file_name2> VARIABLE <variable_name2> [TEXT])

...

#Get file to link and "resource.h" folder
#Unfortunately it is not possible with CMake add custom target in add_executable files list.
get_property(RSC_CPP_FILE TARGET pt_rsc PROPERTY _AR_SRC_FILE)
get_property(RSC_H_DIR TARGET pt_rsc PROPERTY _AR_H_DIR)

add_executable(<your_executable> <your_source_files> ${RSC_CPP_FILE})

আসল উদাহরণ, পদ্ধতির ব্যবহার করে এখানে ডাউনলোড করা যায়, https://bitbucket.org/orex/periodic_table


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