2012-08-26 64 views
3

意外的行爲,我用傳統的C代碼在我目前的C++項目由包括外部頭:混合使用C和C++代碼的產量在GCC

extern "C" { 
# include "ANN/ANN_4t70P1.h" 
# include "ANN/ANN_4t70P2.h" 
# include "ANN/ANN_4t70P3.h" 
# include "ANN/ANN_4t70P4.h" 
} 

頭文件是這樣的:

extern int ANN_4t70P1(float *in, float *out, int init); 

static struct { 
    int NoOfInput; /* Number of Input Units */ 
    int NoOfOutput; /* Number of Output Units */ 
    int(* propFunc)(float *, float*, int); 
} ANN_4t70P1REC = {8,3,ANN_4t70P1}; 

C代碼由古老的批處理文件創建,不能使用C++編譯器進行編譯。儘管如此,這種實現在Windows和Mac OS上運行良好。但是,當我在Linux上使用gcc和g ++編譯代碼並運行應用程序時,ANN_4t70P1REC返回不正確的值。

鏈接項目時是否有任何特殊鏈接器標記遺漏?

謝謝!

+7

ANN_4t70P1REC是一個結構的實例。當你說它「返回不正確的值」時,你是什麼意思? –

+2

也許你需要把它全部編譯成32位?較新的機器可以安裝爲64位,因此您可能需要添加'-m32'編譯器標記 – epatel

+0

抱歉。當然,我的意思是實例ANN_4t70P1REC中的函數propFunc返回意外的結果。 這些值似乎不是隨機值或未分配的內存,但它們與我用XCode或VC++獲得的值完全不同。 – bboverflow

回答

1

你是什麼意思:

的C代碼是由一個古老的批處理文件創建,無法使用C++編譯

你所鏈接使用生成的目標文件進行編譯 不同的編譯器? 如果是的話,嘗試與檢查對象文件:

readelf -h <objectname> 

檢查是否有不同的ABI。如果代碼是由一個非常古老的GCC < 3.3/3.4生成的,則可能會遇到與新版本鏈接問題。

您確定在鏈接過程中沒有任何警告嗎?