2011-08-04 78 views

回答

2

是的。確保您要使用的所有函數都是extern「C」,並且您只對要使用的函數使用基本類型。

如果您使用與G ++相同的GCC版本,那肯定不會有任何問題。跨版本應該沒問題,但可能會有很小的不兼容性。新的GCC(3.0+)符合安騰ABI,因此它們會很好;他們就如何交換&格式數據達成了二元協議。

+0

在我的測試中,我需要添加'-lstdC++'來讓程序鏈接。 –

1

您可以將C應用程序鏈接到一個C++庫, 但你只能包括含有效C頭文件 - 而不是C++ - 代碼, 使用任何C++調用必須聲明與外部的「C函數「 宣言。

-1

最簡單,最簡單的方法要做到這一點,假設您的C代碼是相當理智的,就是簡單地使用g ++構建您的C應用程序。請記住,好的C代碼幾乎總是以C++編譯器爲基礎構建的。那麼就沒有特別的考慮,不需要添加外部「C」語句,也不需要ABI問題等,並且無論函數如何聲明,都可以輕鬆使用C++庫。

1

您需要確保從C代碼調用的C++函數聲明爲extern "C",並且它們的接口只使用可以由C處理的類型(簡單類型,不透明指針等)。

您可能還需要將應用程序與C++編譯器(而不是C編譯器)鏈接,以確保爲C++庫執行了正確的初始化。用於鏈接的C++編譯器必須與用於生成庫的C++編譯器'相同'。這意味着要麼是相同版本的C++編譯器,要麼是它的兼容版本。這通常意味着如果庫是由CompilerB(來自供應商B)生成的,則無法與CompilerA(來自供應商A)鏈接; C++運行時約定是這樣的,不同的編譯器(故意地)使用不同的方案來支持C++的不同特性。

0

如果C++庫具有C++接口,您不能直接使用它們,則必須創建編譯爲C++但具有外部「C」鏈接的包裝。這種包裝的複雜性將取決於界面的特性,使用C++ - 只有諸如類的特性以及函數/運算符重載將需要將OO接口映射到過程接口。

1

您的問題的答案是「是」,但正如其他人指出的那樣,有一些注意事項,對您可以執行的操作的限制& &您是如何做到的。

就在最近與客戶討論這個話題的過程中,我遇到了一篇文章,對這個話題的處理非常好。文章論述了像調用C代碼C++代碼,從C代碼,連接器方面的考慮,功能包裝,異常聯動規範調用C++代碼,以及在C訪問C++類等

文章的事情:Mixing C and C++ Code in the Same Program

相關問題