Как в 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;
}

Теги

C++ / CppMesonАвтоматизация сборкиОбъектный файлПрограммированиеСистема сборки

На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.

В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.