linux-windows跨c++应用

Posted

技术标签:

【中文标题】linux-windows跨c++应用【英文标题】:linux- windows cross c++ application 【发布时间】:2010-11-15 16:39:44 【问题描述】:

我正在开发一个必须在 Linux 和 Windows 上运行的应用程序。 我有一个名为 obj 的对象,我想在代码中使用它,它在 Linux 和 Windows 上具有不同的行为。所以我继承 aaa 并为 Windows 对象调用 WindowsObj,为 Linux 对象调用 LinuxObj。

我的问题是:如何在代码中使用这个对象?我要写什么才能让它同时运行在 Linux 和 Windows 上?

对于切换类型,我使用 typedef,例如:

typedef uint32_t       DWORD;

但是我必须为对象使用什么? 我想写这段代码:

tr1::shared_ptr<WindowsObj> windowsobj (new WindowsObj(parameter));
tr1::shared_ptr<LinuxObj> linuxobj (new LinuxObj(parameter));

有什么想法吗?

【问题讨论】:

你没有对象aaa;你有一个AAA级。您不能从对象继承。对象是类的一个实例。 【参考方案1】:

同样的事情:)

class _object

;

class WindowsObject : public _object

;

class LinuxObject  public _object

;

#if defined(WIN32)
typedef WindowsObject Object;
#else
typedef LinuxObject Object;
#endif

Object myObject;

编辑:当然,WindowsObject 和 LinuxObject 公开的接口必须相同。在本例中,_object 将是定义接口的抽象基类,然后 LinuxObject 和 WindowsObject 将实现此接口,将特定于平台的内容隐藏在其实现文件中。

示例

_object.h

class _object

public:
    virtual void doSomething() = 0;
; // eo class _object

WindowsObject.h

#include "_object.h"

class WindowsObject : public _object
 
public:
    virtual void doSomething();
; // eo class WindowsObject

WindowsObject.cpp

#if defined(WIN32)
#include <windows.h>

void WindowsObject::doSomething()

    // do something totally reliant on windows here
; // eo doSomething
#endif

然后你会为LinuxObject.hLinuxObject.cpp 做同样的事情,后者有完全不同的预处理器指令。例如,#if defined(UNIX) 或类似的味道。请注意实现周围的WIN32 守卫。然后你会有一些你会使用的核心头文件:

#if defined(WIN32)
#include "WindowsObject.h"
typedef WindowsObject Object;
#else
#include "LinuxObject.h"
typedef LinuxObject Object;
#endif

现在,在你的程序中

Object a;
a.doSomething();

值得注意的是,如果只是奇怪的代码行在您的复杂对象中有所不同(例如初始化时的 init 调用、销毁),您可能最好使用一个与平台无关的对象并在实现中设置保护.当存在巨大差异时,此解决方案更有意义。

【讨论】:

嗯,这样代码库就会被编译和链接。我更喜欢单个“平台无关”对象,其中包含#ifdef,仅适用于平台相关部分。 @Wizard - 那么你也可以使用 typedef-s 来处理类声明/定义。但是你应该在两个平台上编译——两个不同的版本。 @Wizard,我想这取决于它们的不同之处。如果存在一些“这里和那里”差异,则单一的“平台无关”方法可以工作,但如果差异很大,那么每两行没有#if defined 混乱的两个实现更具可读性。这真的取决于差异。 这似乎是一个很好的方法,但在我看来,所有代码都被编译的问题有点糟糕 完全同意 Moo-Juice【参考方案2】:

我倾向于为此使用条件编译,例如

#ifdef WIN32
// windows-specific code
#else
// non-windows
#endif

【讨论】:

我认为如果你为这个 #ifdef 事物的 win32 和 *nix 部分编写了相同的类名,那就没问题了。 是的。正如其他人评论的那样,最好的方法取决于两种实现之间的差异。【参考方案3】:

我建议使用跨平台框架,例如 GTK+ 或 wxWidgets,这样您就不必重新发明***...

然后,您应该拥有最少可能依赖于平台的代码,并且可能深入到您的类中。在那里,您可以使用#ifdef 有条件地包含适用于 Windows 或 Unix 的代码。

【讨论】:

【参考方案4】:

您可以在两个不同的 .cpp 文件中使用具有两个不同实现的同一个头文件; PIMPL idiom 使这成为可能,即使这两种实现需要完全不同的数据成员。在为 Windows 编译时,您只需编译并链接一个源代码,而在为 Linux 编译时,您只需编译和链接另一个源代码。

我发现这很有用的一个领域是电子邮件界面。两种操作系统发送电子邮件的方法完全不同。

【讨论】:

【参考方案5】:

您好,如果您可以使用 c++,请使用 boost 和 size_t 输入更好的方法。

【讨论】:

阅读问题。以uintDWORD 为例,他在问如何为自己的复杂类实现类似的事情。

以上是关于linux-windows跨c++应用的主要内容,如果未能解决你的问题,请参考以下文章

Visual C++ 跨线程发送消息

Linux下跨语言调用C++实践

跨移动平台编程[关闭]

如何调试webrtcdemo中的c++代码

哪个跨移动平台应用程序和 UI 框架? [关闭]

如何跨语言在多个应用程序之间建立通信