2012-06-30 74 views
1

我使用objcopy將文本文件轉換爲目標文件,以便使用MinGW和MinGW-64與我的DLL鏈接。使用MinGW,一切都正常,但是對於MinGW-64,我收到了「binary_src_glsl_RGBtoHSV_glsl_end'的未定義引用格式的錯誤。」原始文件名爲RGBtoHSV.glsl,位於二進制文件夾\ src \ glsl中。在objcopy的輸出中,變量名稱是_binary_src_glsl_RGBtoHSV_glsl_end。我的代碼訪問的變量該文件如下:在MinGW 32和64中包含objcopy的二進制blob

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); 

如果我改變變量名,使他們在前面的undercore,如:

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):使用Adding leading underscores to assembly symbols with GCC on Win32?給出的建議我通過改變頭文件使用

extern "C" const char binary_src_glsl_RGBtoHSV_glsl_start asm("_binary_src_glsl_RGBtoHSV_glsl_start"); 

這似乎是解決這個問題,但現在我不知道怎麼便攜本是。 MSVC中是否存在可用的等效語法或C++標準方法?

回答

1

那麼,我已經解決了這個問題,通過定義一個宏來創建一個帶有下劃線的變量(如果需要的話)。然後它創建一個返回指向變量的指針的函數。函數名稱將始終是傳遞給宏的名稱,所以我的代碼的其餘部分可以使用該函數名稱。宏是:

#define GPUFW_STR(x) #x 

#if defined(__GNUC__) | defined(__MINGW32__) | defined(__MINGW64__) 
    //GCC and MinGW allow one to use the asm keyword to give a variable a 
    //specific label, overriding the label used at compile time. 
    #define GPUFW_BINARY_BLOB_EXTERN(T,x) extern "C" const T x asm(GPUFW_STR(_ ## x)); static const T* at_ ## x = &x; 
#else 
    #if defined(_MSC_VER) 
     #if defined(_WIN32) 
      //Visual C++ does not seem to have a method to specify a different 
      //label for a variable at link time, but in 32-bit Windows 
      //extern "C" variables have a leading underscore anyway. 
      #define GPUFW_BINARY_BLOB_EXTERN(T,x) extern "C" const T x; static const T* at_ ## x = &x; 
     #else 
      //64-bit Visual C++ does not prepend an underscore to extern "C" 
      //variable names, causing many problems here. Hence define the 
      //external variable as _x. 
      #define GPUFW_BINARY_BLOB_EXTERN(T,x) extern "C" const T _##x; static const T* at_ ## x = &_ ## x; 
     #endif 
    #else 
     //Unknown compiler. 
     #warning Your compiler was not recognised by GPUFW. Binary blob inclusion may produce linker errors. 
     #if defined(_WIN64) 
      //On 64-bit Windows most compilers seem to stick to the Visual C++ 
      //naming conventions. 
      #define GPUFW_BINARY_BLOB_EXTERN(T,x) extern "C" const T _##x; static const T* at_ ## x = &_ ## x; 
     #else 
      //If all else fails, hope that the compiler uses a leading underscore. 
      #define GPUFW_BINARY_BLOB_EXTERN(T,x) extern "C" const T x; static const T* at_ ## x = &x; 
     #endif 
    #endif 
#endif 

我會很感激爲改善這一解決方案的任何建議。尤其是我可以添加到處理除GCC和MSVC以外的編譯器的分支,因爲我沒有經驗。

作爲一個方面說明,我也嘗試使用LD,使包含我的文本對象文件,但是,從不管我用什麼樣的選擇,我無法刪除前導下劃線同樣的問題受到影響。

相關問題