2011-12-30 78 views
1

我想構建一個簡單的庫,使用Qt的一些功能(無事件循環,只是一些圖像處理和文件加載),然後從庫中調用該庫一個標準的C程序。我已經回顧了here的答案,但答案並未爲我解決問題提供足夠的信息。我建爲被鏈接的靜態庫的庫,幷包裹着extern "C"函數調用,但我得到一堆錯誤,從/usr/include/QtCore/qnamespace.h:-1: In function ‘QT_MODULE’:/usr/include/QtCore/qnamespace.h:54: error: unknown type name ‘namespace’.如何創建基於Qt的庫,可以從C調用

沒有人有從C鏈接到Qt庫一個簡短的教程程序?僅供參考,一切都在Linux(Fedora 15)下,並且C程序和Qt庫都在使用QtCreator構建。

+0

你想從C頭中包含C++頭文件嗎?這是行不通的。 – 2011-12-30 13:30:46

+0

你不能簡單地在你的C程序中包含Qt頭文件。您需要將數據類型和類包裝到自己的結構中,或者按照鏈接答案中的建議使用'void *'。 – 2011-12-30 13:32:47

+0

與此相關:[在c中包裝C++庫? (不要「extern c」)](http://stackoverflow.com/q/6047255/1025391) – moooeeeep 2011-12-30 13:34:39

回答

3

比方說,你想一個包裝,用於創建和刪除QImage,它可以做這樣的事情:

在你的頭文件:

typedef void *my_qimage_t; 

extern "C" my_qimage_t my_create_qimage(int width, int height); 
extern "C" void my_delete_qimage(my_qimage_t image); 

而且在源文件:

extern "C" my_qimage_t my_create_qimage(int width, int height) 
{ 
    QImage *qimage = new Qimage(width, height); 
    return static_cast<my_qimage_t>(qimage); 
} 

extern "C" void my_delete_qimage(my_qimage_t image); 
{ 
    QImage *qimage = static_cast<QImage *>(image); 
    delete qimage; 
} 

my_qimage_t類型從呼叫者的角度來看就是一個黑匣子。所有的操作都必須通過你的庫來完成,通過傳遞這個不透明的指針。

+3

或者你可以在C頭文件中聲明struct QImage;避免所有這些類型定義和不安全的轉換。 – 2011-12-30 13:53:42

相關問題