Как вы встраиваете файлы ресурсов в C?

Единственный способ, которым я знаю, как это сделать, - преобразовать файл в исходный файл C с одним массивом байтов/символов, содержащим содержимое файла ресурсов в шестнадцатеричном формате.

Есть ли лучший или более простой способ сделать это?


person theanine    schedule 05.04.2012    source источник
comment
Надеюсь, вы знаете, что ответ на эту проблему полностью зависит от специфики используемого набора инструментов (компилятор, компоновщик, формат исполняемого файла и т. д.). Поэтому вам следует добавить как можно больше деталей к вашему вопросу.   -  person Oliver Charlesworth    schedule 06.04.2012
comment
@OliCharlesworth: Да, хорошая мысль. Я использую набор инструментов GNU Arm (arm-elf-gcc).   -  person theanine    schedule 06.04.2012
comment
Стоит отметить, что я действительно надеялся на переносимый ответ, так что этот вопрос на самом деле будет более полезным для тех, кто его найдет.   -  person theanine    schedule 06.04.2012
comment
Самое портативное решение — это то, которое у вас уже есть.   -  person Carl Norum    schedule 06.04.2012
comment
Вот ссылка на программу, в которой говорится, что она преобразует двоичные файлы в заголовки C/C++. Я не могу поручиться за это, хотя я не использовал его сам. sourceforge.net/projects/bin2header   -  person Brian Swift    schedule 06.04.2012
comment
Мне кажется странным, что такой старый низкоуровневый язык не имеет возможности компилировать или связывать двоичные файлы вместе с исходным кодом, который их будет использовать.   -  person Georgina Davenport    schedule 14.05.2021


Ответы (3)


Вот хороший трюк, который я использую с кросс-компилятором gcc-arm; включая файл через файл языка ассемблера. В этом примере я включаю содержимое файла public_key.pem.

pubkey.s

 .section ".rodata"
 .globl pubkey
 .type pubkey, STT_OBJECT
pubkey:
 .incbin "public_key.pem"
 .byte 0
 .size pubkey, .-pubkey

соответствующий pubkey.h

#ifndef PUBKEY_H
#define PUBKEY_H
/*
 * This is a binary blob, the public key in PEM format,
 * brought in by pubkey.s
 */
extern const char pubkey[];

#endif // PUBKEY_H

Теперь исходники C могут включать pubkey.h, скомпилировать pubkey.s с помощью gcc и связать его с вашим приложением, и все готово. sizeof(pubkey) тоже работает.

person blueshift    schedule 06.04.2012
comment
Как работает sizeof? Разве sizeof не оценивается во время компиляции, когда содержимое pubkey.s даже не будет учитываться? РЕДАКТИРОВАТЬ: Вы имели в виду strlen? - person thenickdude; 21.11.2014
comment
@thenickdude .size, вероятно, делает этот трюк. - person Daniel Jour; 30.10.2019
comment
ок, у меня не работает, пришлось указать размер в переменной: pubkey_size: .int (. - pubkey) сразу после .size; и конечно же .globl pubkey_size и .type pubkey_size, STT_OBJECT. Используется через extern const int pubkey_size; - person Daniel Jour; 01.11.2019

Способ, который вы описали, является лучшим/самым простым/самым портативным. Просто напишите быстрый инструмент (или найдите существующий) для создания файлов C для вас. И убедитесь, что вы правильно используете ключевые слова const (и, возможно, static), когда делаете это, иначе ваша программа будет тратить много памяти.

person R.. GitHub STOP HELPING ICE    schedule 06.04.2012

Мне нужно было что-то подобное некоторое время назад, и я создал инструмент для этого. Это инструмент Python под названием mkcres (https://github.com/jahnf/mkcres) и выложил на github.

  • Хотя документации немного не хватает, есть примеры того, как интегрировать ее в процесс сборки с помощью CMake или простых файлов make.
  • Принимает файл .json в качестве конфигурации генерации файла ресурсов.
  • Он может обнаруживать изменения в файлах ресурсов и автоматически регенерировать соответствующие файлы C, если это необходимо.
  • Недостаток: вам понадобится питон (2 или 3)
  • Достоинства: Не зависит от компилятора, должен работать с каждым компилятором C/C++.
person Jahn    schedule 11.09.2015