您的问题相当笼统,因此我只能为您希望移植到 Mac OS X 并拥有本机 Cocoa UI 的主要基于 C++ 的应用程序提供一些高级架构提示。
线程:仅仅因为 C++ 代码在 Windows 上具有主线程并不意味着它需要在 Mac OS X 上。使用 NSApplication 以通常的 Cocoa 方式启动您的应用程序,然后在您的应用程序委托中,applicationDidFinishLaunching
您应该做两件事:
- 启动一个 NSThread,即使它什么都不做并且立即返回。您需要这样做以将 Cocoa 切换为内部线程安全(例如可以)。由于您的 C++ 代码将改为启动 pthread,因此您需要首先启动至少一个更高级别的 NSThread。
- 调用 C++ 代码的启动例程。如果此代码长时间运行,请启动一个单独的线程。没有理由让您的 C++ 代码需要在 Mac OS X 的主线程上运行;它可以在任何辅助线程上。Mac OS X 上的主线程唯一的特别之处是事件在那里传递,UI 更改应该从那里发生。这两件事都应该在 Cocoa 本地代码中处理,而不是在可移植的 C++ 代码中。
语言障碍你有语言障碍需要处理。您的 C++ 代码不能直接访问 Objective-C 对象,反之亦然。您可以使用 Objective-C++ 解决这个问题,但最佳实践是仅将 Objective-C++ 用于薄翻译层并将两者分开。除了提供更规范的编程环境之外,它还有助于在逻辑上将 UI 代码(在 Objective-C 中)与较低级别的应用程序服务(在 C++ 中)分开。Rob Napier 写了很多关于如何做到这一点的文章,我建议阅读他最近的博客文章以及他早期关于该主题的一些文章。
为了更概括地阐述,您将使用从 C++ 到 Objective-C 的几种技术之一,因为这是您询问的方向:
提供可从 Objective-C 或 C++ 调用的 C 接口函数。它们的实现可以用任何最方便的语言编写。这些函数的标头将包含如下行,让 C++ 代码知道它们具有 C 而不是 C++ 接口:
#if defined __cplusplus
extern "C" {
#endif
void passAString(const char *string);
// ... some other C interface functions
#if defined __cplusplus
}
#endif
提供 Objective-C++ 桥接函数,在调用本机 Objective-C 代码之前将 C++ 对象转换为 Objective-C 对象。
编写 Objective-C++ 桥接对象。这些为底层的 Objective-C 对象提供了一个薄的 C++ 单板,因此 C++ 层可以与之交互。
显然,您需要反过来使用类似的技术从 Objective-C 代码调用 C++。