Как в C++ проекте с Meson включить контент любого (например, текстового) файла в объектный файл
Добавлено 26 сентября 2023 в 03:06
Простой рецепт, как в проекте, использующем для сборки Meson, встроить содержимое любого файла (например, текстового) в объектный файл и затем использовать его в коде на C++.
meson.build:
project(
'embed_binary',
['cpp'],
default_options : [ 'cpp_std=c++17' ],
)
# Сначала копируем исходный файл данных в каталог сборки.
# Это позволяет избежать передачи в 'ld' потенциально
# непредсказуемых относительных путей, таких как
# '../data.txt',
# что приведет к появлению таких символов, как
# _binary____data_txt_start
# поскольку "../" преобразуется в "___".
data_local = custom_target('copy-data',
output : 'data.txt',
input : 'data.txt',
command : [ 'cp', '@INPUT@', '@OUTPUT@' ],
)
# Создаем объектный файл, содержащий содержимое
# источника данных и два символа, отмечающих его границы.
ld = find_program('ld')
data = custom_target('objectify-data',
output : 'data.o',
input : data_local,
command : [ ld, '--relocatable', '--format', 'binary',
'--output', '@OUTPUT@', '@INPUT@' ],
)
executable(
'embed_binary',
[ 'main.cpp', data ],
)
main.cpp:
#include <stdio.h>
extern char _binary_data_txt_start;
extern char _binary_data_txt_end;
int main()
{
char* p = &_binary_data_txt_start;
while(p != &_binary_data_txt_end)
putchar(*p++);
return 0;
}