Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: theanineОтветов: 3

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

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

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

cembedresource-files

Ответы

Ответ 1 · рейтинг 3 · blueshift

Вот хороший трюк, который я использую с кросс-компилятором 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) тоже работает.

Ответ 2 · рейтинг 2 · R.. GitHub STOP HELPING ICE

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

Ответ 3 · Jahn

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы