2011-10-14 44 views
2

我的項目是一個使用C++編寫的Qt應用程序,運行在Windows,OS X和Linux上。 Qt在抽象中沒有涉及到某些方面:在桌面上迭代其他活動的應用程序窗口,並返回它們的名稱,「句柄」和圖標。Qt:將本地操作系統特定代碼添加到項目

我有OS特定的代碼來做到這一點。

在Windows

純粹的Win32/C++ 的Objective-C在OS X 和一些Linux X11的C++代碼

我想建立自己的抽象,它會利用這些操作系統特定的原生片段提供它的它需要的運行時數據。

所以,我得有Objective-C代碼生成,並與我的OS X構建運行 的Win32/C++與Windows 和使用Linux

讓我們專注於Mac的相似,只是在這個例子。我如何將一個客觀的C類組合到我的Qt C++項目中?我如何從C++調用它?有什麼樣的地方我可以看到它是如何完成的?

理想情況下,我希望在項目中具有特定於操作系統的代碼,而不是構建單獨的共享庫以進行鏈接,但如果沒有其他操作可以完成,則這是一個選項。

回答

2

我想我會在這種情況下創建共享庫。無論如何,我要提出的是一個想法,但應該工作。

通過使用qmake功能,我將爲每個平臺創建一個具有不同配置的專業文件,其中每個配置(CONFIG變量)包含不同的來源(如果您不想使用簡單的ifdef,我通常會這樣做是創建一個共同的頭,和不同的實現在不同的cpp文件每個平臺例如:

/* platformaspecific.h */ 
class PlatformSpecific : public QObject 
{ 
    PlatformSpecific(QObject* parent = 0); 
    QList<void*> getHandleForWindows(...); 
    void doSomethingPlatformIndependent(); 
    ... 
}; 

/* platformspecific_x11.cpp */ 
PlatformSpecific::PlatformSpecific(QObject* parent) : QObject(parent) 
{ 
    ... 
} 

PlatformSpecific::getHandleForWindows(...) 
{ 
    ... 
} 

... 

/* platformspecific_win.cpp */ 
PlatformSpecific::PlatformSpecific(QObject* parent) : QObject(parent) 
{ 
    ... 
} 

QList<void*> PlatformSpecific::getHandleForWindows(...) 
{ 
    ... 
} 

/* platformspecific_common.cpp (if needed) */ 
void PlatformSpecific::doSomethingPlatformIndependent() 

... 

等等...

然後,在你的.pro文件,可以使用不同的範圍並根據其相關配置包括源文件。

CONFIG += X11 

X11 { 
    SOURCES += platformspecific_x11.cpp 
} 
else:WIN { 
    SOURCES += platformspecific_win.cpp 
} 
... 

SOURCES += platformspecific_common.cpp 

之後,對於包括Objective-C在內的部分,您必須使用Objective-C++。你可以很容易地將C++和Objective-C與Objective-C++混合使用,只允許使用一些東西,比如用Objective-C擴展C++類等等......你可以找到任何你需要用Objective-C++編程的東西Apple開發中心。我不知道使用Qt Creator進行Objective-C++編程有多好,但無論如何,您始終可以使用qmake從.pro文件創建一個Xcode項目:請閱讀此http://doc.qt.io/archives/qt-4.7/qtmac-as-native.html#development-tools

通過使用這種方法,或類似的東西,它應該是相當舒適的工作。

0

我會建議讓他們靜態庫和鏈接他們。它使代碼簡單和直接。它增加了構建的複雜性,但總的來說,它是全部或者全部。一旦你得到它的工作,沒有任何陷阱。

像預處理器這樣的事情定義了工作,但是當它們被破壞時,開發人員爲什麼並不總是顯而易見的。

相關問題