В другом Stackoverflow Q / A был пост, который показал, как встраивать произвольные данные в сборку и ссылаться на них в C ++.
Это прекрасно работает в Linux, но при компиляции для Windows (используя mingw-w64) сборка должна отличаться, потому что исполняемый файл использует формат COFF вместо ELF.
Моя текущая сборка для встраивания данных выглядит следующим образом (для COFF):
# data.asm
.section .rodata
.global data_bin
.def data_bin; .scl 2; .type 50; .endef
.align 4
data_bin:
.incbin "dataFile"data_bin_end:
.global data_bin_size
.def data_bin_size; .scl 2; .type 15; .endef
.align 8
data_bin_size:
.quad data_bin_end - data_bin
(Я использую «.scl 2», потому что класс хранения «2», очевидно, является глобальным / внешним, и я использую «.type 50» для данных, так как «50» — это значение для массива символов, и я использую «.type 15» для data_size, так как «15» — это значение для беззнакового long (все это как указано здесь))
Я все еще использую тот же заголовочный файл для ссылки на данные:
// data.hpp
#ifndef DATA_ASM_HPP
#define DATA_ASM_HPP
extern const char data_bin[];
extern const unsigned long long data_bin_size;
#endif
Сборка компилируется нормально, как и остальная часть программы. Проблема возникает при компоновке, когда компоновщик утверждает, что data_bin и data_bin_size не определены, хотя я определил их в коде сборки (неопределенная ссылка на data_bin).
Любые идеи / решения о том, как это исправить? Я дважды проверил, и объектный файл, сгенерированный при компиляции кода сборки, включен в шаг компоновки.
добавлять extern "C" { }
вокруг data.hpp (в linux имена переменных не искажены, но в windows они есть)
И, возможно, вам нужно добавить «_» к именам переменных в asm.
Других решений пока нет …