Qt:向项目添加本机操作系统特定代码

时间:2011-10-14 19:41:33

标签: c++ objective-c qt

我的项目是一个用C ++编写的Qt应用程序,运行在Windows,OS X和Linux上。 Qt在其抽象中没有涉及某个区域:迭代桌面上活动的其他应用程序窗口,并返回其名称,“句柄”和图标。

我有特定于操作系统的代码。

Windows上的纯Win32 / C ++ OS X上的Objective-C 和Linux的一些X11 c ++代码

我想构建自己的抽象,利用这些特定于操作系统的本机代码片段为其提供所需的运行时数据。

所以,我必须构建Objective-C代码并运行我的OS X版本 带窗口的Win32 / c ++ 与Linux类似

让我们专注于Mac,仅用于此示例。如何将目标C类合并到我的Qt C ++项目中?我怎么用C ++调用它?是否有任何样品我可以看到它是如何完成的?

理想情况下,我希望在项目中使用特定于操作系统的代码,而不是构建单独的共享库以进行链接,尽管如果没有别的办法可以做,这是一个选项。

2 个答案:

答案 0 :(得分: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包含源文件。

CONFIG += X11

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

SOURCES += platformspecific_common.cpp

在此之后,对于包含Objective-C的部分,您将不得不使用Objective-C ++。您可以使用Objective-C ++轻松地混合使用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

通过使用这种方法或类似方法,它应该非常适合工作。

答案 1 :(得分:0)

我建议将它们作为静态库并将它们链接起来。它使代码变得简单直接。它增加了构建的复杂性,但一般来说,它是全有或全无。一旦你开始工作,就没有任何陷阱了。

预处理器之类的东西定义了工作,但是当它们破坏时,开发人员并不总是明白为什么。