2010-10-22 199 views
2

我有一套用C++開發的軟件庫模塊。所以,我使用g ++來編譯我的軟件。調用用g ++編譯的庫的C/C++函數,用gcc編譯的程序

這必須被各種現有的應用程序使用,這些應用程序用C語言編寫並使用gcc編譯。

當其他團隊使用g ++編譯它們的代碼時,由於嚴格的C++類型檢查規則,它們開始出現大量編譯器錯誤。這打破了他們的申請。更糟的是,他們正在使用一些第三方庫代碼,這些代碼不能用g ++編譯。

如果他們使用gcc,那麼存在鏈接器錯誤(未解析的符號)。我的問題是...... 「有沒有辦法讓我的庫代碼與他們的應用程序鏈接,而不必更改各自的編譯器?也就是說,我仍然必須使用g ++,因爲我使用了類/在我的代碼中大量使用對象,他們沒有選擇使用g ++,這會破壞他們的應用程序?「。

謝謝你的幫助。

問候, 拉溫德拉

+1

鏈接預編譯的C++代碼基本上要求您使用相同的精確編譯器。有一些方法可以工作(使用普通的舊數據類型或序列化,並帶有extern「C」類型的唯一接口),但是有很多東西根本無法工作並且會中斷,如果您嘗試使用你的公共接口是。 – 2010-10-22 05:26:04

回答

0

一個可能遇到的可能是不同的版本具有不同ABI格式的G ++的結果的問題。至少,不要指望4.1版之前的G ++版本能夠使用4.1或更高版本編譯的代碼。

混合C和C++要求C++代碼都導出C兼容接口。這是通過用extern "C"說明符聲明空閒函數(不能在類上使用)完成的。 (some notes on the c++ faq lite_

extern "C" { 
    #include "c_language_headers.h" 

    int c_accessible_function(int); 

    struct c_accessible_datatype { }; 
} 
+0

Hi TokenMacGuy, – Ravindranath 2010-10-22 06:11:44

+0

感謝您的快速回復。我已經在做這部分 – Ravindranath 2010-10-22 06:12:13

+0

我正在使用#ifdef __cplusplus extern「C」#endif部分。但是,儘管如此,我還是覺得這兩個模塊(調用的c代碼和C++庫)應該只用g ++編譯。糾正我,如果我錯了。 – Ravindranath 2010-10-22 06:13:44