亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用GCC的C / C ++:靜態地將資源文件添加到可執行文件/庫

使用GCC的C / C ++:靜態地將資源文件添加到可執行文件/庫

梵蒂岡之花 2019-07-31 15:39:45
使用GCC的C / C ++:靜態地將資源文件添加到可執行文件/庫有沒有人知道如何使用GCC將任何資源文件靜態編譯到可執行文件或共享庫文件中?例如,我想添加永遠不會改變的圖像文件(如果他們這樣做,我不得不替換文件),并且不希望它們在文件系統中存在。如果這是可能的(我認為這是因為Visual C ++ for Windows也可以這樣做),我如何加載存儲在自己的二進制文件中的文件?可執行文件是否解析自身,找到文件并從中提取數據?也許GCC有一個選項,我還沒有見過。使用搜索引擎并沒有真正吐出正確的東西。我需要這個用于共享庫和普通的ELF可執行文件。任何幫助表示贊賞
查看完整描述

3 回答

?
慕哥9229398

TA貢獻1877條經驗 獲得超6個贊

使用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雖然不是很好,你當然可以在任何可以使用迭代器的地方使用指針。

如果你在automake中使用它,請不要忘記適當地設置BUILT_SOURCES。

這樣做的好處是:

  1. 你得到文本,所以它可以在版本控制和補丁明智

  2. 它在每個平臺上都是可移植的并且定義良好


查看完整回答
反對 回復 2019-07-31
?
智慧大石

TA貢獻1946條經驗 獲得超3個贊

我已經開始喜歡John Ripley .incbin基于程序集的解決方案提供的控件,現在使用一個變體。

我使用objcopy(GNU binutils)將文件foo-data.bin中的二進制數據鏈接到可執行文件的數據部分:

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

這為您提供了一個foo-data.o可以鏈接到可執行文件的目標文件。C界面看起來像

/** 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更多地使用這些參數。


查看完整回答
反對 回復 2019-07-31
  • 3 回答
  • 0 關注
  • 1208 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號