c++ - Qt:プロジェクトにネイティブOS固有のコードを追加する

c++ objective-c qt

私のプロジェクトは、C++で書かれたQtアプリケーションで、Windows、OS X、Linuxで実行されています。 Qtが抽象化でカバーしていない特定の領域があります。デスクトップでアクティブな他のアプリケーションウィンドウを繰り返し、それらの名前、「ハンドル」、アイコンを返します。

それを行うためのOS固有のコードがあります。

Windows上の純粋なWin32 / C++
OS X上のObjective-C
Linux用のいくつかのX11 c++コード

OS固有のネイティブスニペットを利用して必要なランタイムデータを提供する独自の抽象化を構築したいと思います。

したがって、私は目的のCコードをビルドし、OS Xビルドで実行する必要があります
WindowsでのWin32 / c++
Linuxでも同様

この例では、Macに焦点を当てましょう。目的のCクラスをQt C++プロジェクトに結合するにはどうすればよいですか? C++から呼び出すにはどうすればよいですか?方法を確認できるサンプルはありますか?

理想的には、プロジェクトにOS固有のコードを含め、リンクする個別の共有ライブラリを構築したくないのですが、これは他に何もできない場合のオプションです。
答え
このような状況で共有ライブラリを作成すると思います。とにかく、私が提案しようとしているのはアイデアですが、うまくいくはずです。

qmake機能を使用して、プラットフォームごとに異なる構成のproファイルを作成します。各構成(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に従ってソースファイルを含めます。

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 Dev Center。 Qt Creatorを使用したObjective-C++でのプログラミングがどれほど優れているかはわかりませんが、とにかくqmakeを使用して.proファイルからXcodeプロジェクトをいつでも作成できます。このhttp://doc.qt.io/archives/qt-4.7/qtmac-as-native.html#development-toolsをお読みください。

このアプローチまたは同様の方法を使用することで、作業は非常に快適になります。
関連記事

c++ - C++でのCライブラリ関数の実装

c++ - すべての要素を削除するC++のtr1::array

c++ - C++メンバー関数の非メンバーラッパーを「自動的に」作成する

c++ - std::set_differenceセットキーとマップキーを比較することは可能ですか?

c++ - 配列をC++の関数に渡す

c++ - 述語ファンクタのパッケージ化

c++ - 空のBoostアキュムレータを使用する

c++ - VC++リソースコンパイラ(RC)オプション/ n…?

c++ - GL_DRAW_FRAMEBUFFERターゲットを使用すると、glBindFramebufferが「無効な操作」GLエラーを引き起こす

c++ - クラスのメンバーアクセス