tgoop.com/cxx95/85
Create:
Last Update:
Last Update:
#story
Встраивание файлов в исходники 📦
Иногда удобнее, чтобы бинарь не загружал какие-то файлы из файловой системы, а имел их встроенными прямо в исходный код во время компиляции. Кому это может быть нужно, из разных сфер:
Чаще всего для такой цели используется программа xxd
.
Посмотрим на пример: файл template.cpp - это шаблон для генерации кода.
Запустим команду
xxd -i template.cpp template.cpp.dataПолучим такой файл template.cpp.data:
unsigned char template_cpp[] = {Потом этот файл можно подключить и сделать из него строку (надо указать длину, так как байты не нуль-терминированы):
/* байты */
}
unsigned int template_cpp_len = /* кол-во байтов */;
#include "template.cpp.data"В системе сборки можно автоматизировать, чтобы команда
const std::string TEMPLATE{(char*)template_cpp, template_cpp_len};
xxd
запускалась автоматически каждый раз при изменении шаблона, и сгенерированный файл не попадал в исходники (то есть лежал в build-директории): ссылка на функцию CMake.Подобную функциональность несколько лет пытаются внести в C/C++ в виде директивы препроцессора
#embed
. Пока удалось это сделать для C23 - крутой блог с примерами:static const char sound_signature[] = {
#embed <sdk/jump.wav>
};
// verify PCM WAV resource signature
assert(sound_signature[0] == 'R');
assert(sound_signature[1] == 'I');
assert(sound_signature[2] == 'F');
assert(sound_signature[3] == 'F');