2012-08-01 69 views
0

我有一個用C編寫的程序,我需要使用用C++編寫的KDIS庫。我在KDevelop中用automake &朋友編譯我的C程序。我怎樣才能一起編譯?因爲我想在C程序中調用一些KDIS函數。編譯C和C++

預先感謝您。

+1

圖書館是否提供什麼類型的接口爲你? C還是C++? – 2012-08-01 08:39:01

+0

一個C++接口 – dani 2012-08-01 08:39:49

回答

6

如果您需要調用不是extern "C"的C++函數,那麼您必須自己從C++程序中執行此操作。您可以在項目中創建一個單獨的C++文件,該文件包含extern "C"函數中需要的所有庫函數,供項目的其餘部分使用。你必須告訴自動工具你使用C和C++。文件擴展名應該足以決定哪個是哪個。

給你舉個例子,考慮一些libmagic用C++編寫以下mymagic.cc創建綁定:

#include <libmagic/magic.hh> 
extern "C" { 
    int doMagic() { 
    magic::Wizard w("foo", 42); 
    magic::Result res = w.doMagic(); 
    return res.getResultCode(); 
    } 
} 

到應用程序的其餘部分,doMagic()似乎只是另一個C函數。但裏面是C++,所以它可以使用任何你想要的C++結構。當你需要從庫中傳遞東西時,你應該使用指向不透明類型的指針。所以在頭mymagic.h這也被你的C代碼,你可以寫

struct magicValue; 
int doMagic(void); 
struct magicValue* createMagic(void); 
void destroyMagic(struct magicValue*); 

而在mymagic.cc你那麼更明確:

struct magicValue { 
    magic::value v; 
    magicValue(magic::value val) : v(val) { } 
}; 
magicValue* createMagic() { 
    return new magicValue(magic::value("foo")); 
} 
void destroyMagic(magicValue*) { 
    delete magicValue; 
} 
+0

所以我應該用extern「C++中的所有函數」創建一個main.c文件。但該函數的參數是C++? – dani 2012-08-01 08:57:29

+2

@dani:如果KDIS沒有提供C接口,那麼你需要發明一個。這取決於你如何實現這一點,但通常你會發現自己在C中定義了opaque指針類型來引用C++中的對象類型,並且寫了很多形式爲'ReturnType Foo_method(Foo * self,other args)的函數。 ..){return self>方法(其他參數...); }'。 – 2012-08-01 09:08:15

+0

@dani,我不確定我是否理解你的評論。但我添加了一些例子,希望能夠澄清一些事情。也看看鏈接SingerOfTheFall [提供](http://stackoverflow.com/a/11755623/1468366),他們似乎有更多的細節,如何不僅調用函數,而且以各種方式在C和C++。 – MvG 2012-08-01 09:19:52

2

This link可能會幫助您瞭解如何在應用程序中混合使用C和C++代碼。

另外,看看this堆棧溢出問題,我相信這就是你需要的。