我正在使用 objcopy 将文本文件转换为目标文件,以便使用 MinGW 和 MinGW-64 与我的 DLL 链接。使用 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 位)中找不到。我确实尝试了 objcopy 的 --remove-remove-leading-char 选项,但这没有效果。据我所见,我的选择是在为 MinGW 32 位构建时使用“--prefix-symbol _”为 objcopy 生成的变量名称添加下划线,在这种情况下,上述变量名称将在 32和 64 位。
这个问题还有其他解决方案吗?理想情况下,我想要一些类似的东西
extern "C" fix_underscore_problem const char binary_src_glsl_RGBtoHSV_glsl_start;
其中 fix_underscore_problem 是修复前导下划线问题的神奇命令。
更新 (2012-07-01):使用在 Win32 上使用 GCC 将前导下划线添加到程序集符号中给出的建议?我通过头文件更改为使用
extern "C" const char binary_src_glsl_RGBtoHSV_glsl_start asm("_binary_src_glsl_RGBtoHSV_glsl_start");
这似乎解决了问题,但现在我想知道它的便携性如何。MSVC 或 C++ 标准方法中是否有等效的语法?