MinGW と MinGW-64 を使用して DLL とリンクするために、objcopy を使用してテキスト ファイルをオブジェクト ファイルに変換しています。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 に試してみましたが、効果はありませんでした。私が見る限り、私のオプションは、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++ 標準の方法で利用できる同等の構文はありますか?