2012-12-21 109 views
1

Possible Duplicate:
How to call a lib written in C++ from C?如何從C調用C++函數?

我與pHash修修補補,我想調用的函數從文件位置生成一個感性哈希值。當我嘗試打電話叫ph_dct_imagehash編譯器函數拋出這個錯誤:

/usr/include/CImg.h:72:18: fatal error: cstdio: No such file or directory 
compilation terminated. 

在這一點上,我意識到,pHash是用C++編寫,所以包括在C程序C++頭文件是行不通的。儘管如此,函數本身似乎應該可以從C中調用,因爲它沒有參數,也沒有返回值使用C++構造。有沒有什麼好方法從C調用C++函數ph_dct_imagehash?

注:我主要是爲了在C(而不是C++)上做得更好。這就是爲什麼我把自己限制在C.

回答

5

只要你有一個unmangled符號名稱來調用,你可以很容易地鏈接你的C++庫和你的C程序。您需要製作一個C安全的頭文件或其他方式來轉發聲明函數名稱,然後在最後將所有東西鏈接在一起(確保使用支持C++的鏈接器!)。

這裏有一個簡單的例子:

$ cat cplusplus.cpp 
#include <string> 

extern "C" 
const char *cplusplusFunction(void) 
{ 
    static std::string a = "Hello, C++"; 
    return a.c_str(); 
} 
$ cat example.c 
#include <stdio.h> 

const char *cplusplusFunction(void); 

int main(void) 
{ 
    printf("%s\n", cplusplusFunction()); 
    return 0; 
} 
$ c++ -c -o cplusplus.o cplusplus.cpp 
$ cc -c -o example.o example.c 
$c++ -o example example.o cplusplus.o 
$ ./example 
Hello, C++ 
0

如果您使用的是C++編譯器(比如G ++而不是GCC),你可以從你的C語言代碼無縫,一切都調用C++代碼會工作得很好。 這將是事實,因爲除非你做的事情真的很奇怪,C包含在C++中..

而且,如果使用g ++編譯時仍然不起作用,則應該將.c文件後綴更改爲.c。 cc,.cpp,.cxx等。最好.cc

+2

除非您嘗試編譯的代碼使用C++保留字,例如new,class,typename等。如果你有幾千行代碼,你只想把一小部分代碼掛鉤到一些C++中,那很可能是一個問題。 –

+0

+1 @MatsPetersson。我的私人寵物是「malloc」周圍的所有鑄件。 「修復」所有這些可能是一件苦差事。 –

2

您需要將C++代碼函數與C代碼分開。

通常,這是通過具有僅包含C(而非C++)聲明的函數和C數據結構來解決問題所需的.h文件以及包含C到C++接口函數的C++文件完成的。

您還需要使用

#ifdef __cplusplus 
extern "C" { 
#endif 
.... your types and functions ... 
#ifdef __cplusplus 
} 
#endif 

在你的頭文件,以確保C++編譯器不「軋車」的名稱(標識類型參數的功能,如名函數Blur(int x,int y)可以被稱爲_Blur_ii,其中常規C不在函數名稱上添加這種「額外的東西」,所以C編譯器會調用_Blur - 當然,當你嘗試鏈接時,鏈接器會顯示「找不到_Blur」

編輯:另外,絕對100%確保你沒有「泄漏」到C代碼中的異常,如果你這樣做,anythin g可能會發生,並且通常不是黃金從天而降,而是一些不好的東西...... :)