Я использую objcopy для преобразования текстового файла в объектный файл для связывания с моей DLL с помощью MinGW и MinGW-64. С MinGW все работает нормально, но с MinGW-64 я получаю ошибки вида "неопределенная ссылка на `binary_src_glsl_RGBtoHSV_glsl_end'". Исходный файл называется RGBtoHSV.glsl и находится в папке binary\src\glsl. В выводе objcopy имя переменной _binary_src_glsl_RGBtoHSV_glsl_end. Мой код для доступа к переменным для этого файла выглядит следующим образом:
extern "C" const char binary_src_glsl_RGBtoHSV_glsl_start;
extern "C" const char binary_src_glsl_RGBtoHSV_glsl_end;
const std::string RGBtoHSV = std::string(&binary_src_glsl_RGBtoHSV_glsl_start, &binary_src_glsl_RGBtoHSV_glsl_end-&binary_src_glsl_RGBtoHSV_glsl_start);
Если я изменю имена переменных так, чтобы перед ними было подчеркивание, например:
extern "C" const char _binary_src_glsl_RGBtoHSV_glsl_start;
Затем этот символ находится в MinGW-64, но не в MinGW (32 бита). Я попробовал параметр --remove-remove-leading-char для objcopy, но это не дало никакого эффекта. Насколько я вижу, мои варианты состоят в том, чтобы либо добавить подчеркивание к именам переменных, сгенерированных objcopy, используя «--prefix-symbol _» при сборке для MinGW 32 бит, и в этом случае указанное выше имя переменной будет работать в 32 битах. и 64 бит.
Есть ли другое решение этой проблемы? В идеале я хотел бы что-то вроде
extern "C" fix_underscore_problem const char binary_src_glsl_RGBtoHSV_glsl_start;
Где fix_underscore_problem — это волшебная команда для исправления проблемы с подчеркиванием.
Обновление (01.07.2012): использование рекомендаций, приведенных в Добавить начальные символы подчеркивания к символам сборки с помощью GCC в Win32? Я изменил файл заголовка, чтобы использовать
extern "C" const char binary_src_glsl_RGBtoHSV_glsl_start asm("_binary_src_glsl_RGBtoHSV_glsl_start");
Кажется, это решает проблему, но теперь мне интересно, насколько это портативно. Есть ли эквивалентный синтаксис, доступный в MSVC или стандартный способ C++?