3

我有一个相对复杂的 C++ 应用程序的源代码,该应用程序涉及许多库、依赖项等。我正在尝试使用它并向它添加一个 Cocoa GUI。到目前为止,我在以下方面失败了:

  • 创建一个新的 Cocoa xcodeproj 并尝试将所有库等移动到 Cocoa 应用程序中。我只是无法构建它。无论我做什么,都会出现成千上万的错误。我在这里的技能还不足以弄清楚发生了什么。

所以,我认为一个更简单的方法必须是对 C++ xcodeproj 进行适当的更改,以使 main() 函数启动一个 NSApplication 而不是它现在正在做的任何事情。

有谁知道我必须做什么,确切地说,才能做到这一点?我是 Cocoa 的新手,所以我不确定我必须添加什么。作为参考,C++ 应用程序的 main.cpp 实际上非常简单:

int main() {
    ofSetupOpenGL(320,300, OF_WINDOW);
    ofRunApp(new testApp());
}

我想做的是做出所有正确的改变,所以这可以是:

#import <Cocoa/Cocoa.h>

int main(int argc, char *argv[]) {
    return NSApplicationMain(argc,  (const char **) argv);
}

并让旧的 xcodeproj 编译所有“东西”仍然在其中,然后当它运行时,打开 Cocoa 窗口。

应该注意的是,C++ xcodeproj 似乎完全没有与 Cocoa 相关的内容,甚至没有与 Objective-C 相关的内容,因此我们必须添加所有相关内容并进行所有相关更改。

有任何想法吗?

(或者,或者,如果您知道我可以如何轻松地从 C++ xcodeproj 中获取所有内容以构建一个干净利落的 Cocoa xcodeproj,请告诉我,但目前这对我来说似乎更复杂。)

谢谢!

4

4 回答 4

1

如果您不了解 c++ 或类似的可可,这可能不会顺利进行。

否则,如果您确实知道自己在做什么,那么大部分过渡将是单调的。否则,准备学习一些关于objc的东西。

第一:不要费心将功能正常的 c++ 程序的实现转换为 objc。这是对时间的巨大浪费。您只需包装、绑定和更改程序以在该上下文中运行。您不必在 objc 中编写所有内容。

第二:您必须编写一些 objc 绑定/包装器才能使用 c++ 程序。您将需要进行一些包装,尤其是对于 ui 元素和用户事件。

第三:源代码应该按原样编译。您只需将它们添加到您的新可可模板项目中,如果它具有可识别的 c++ 扩展名,gcc 默认会将其编译为 cpp 文件。要使用 c++ 和 objc,请使用 objc++ FILENAME.mm(您也可以使用.M,但也不支持)。更好的是,将原始 cpp 源代码放在应用程序链接到的单独库中。

第四:现在你有一个可可项目模板并编译 cpp 源,添加包装器/绑定,以便可可事件/绘图在该上下文中执行。根据您的示例代码,您的起点使用 Open GL,因此如果您想要 Cocoa 应用程序,则必须使用类似 NSOpenGLView 的东西。您需要实施的具体内容取决于项目。

您的主函数应该调用 NSApplicationMain,那么您用于将绑定写入 c++ 代码的初始条目可能是事件处理、NSWindow、NSView 和 NSApplication。

如果你是 objc 的新手,你可能会有一些提升。

于 2011-01-15T09:56:08.877 回答
1

嗯,我有两个想法...

  1. 你真的需要可可吗?可以使用 QT、wxWidgets 等添加 Mac 支持。
  2. 您不必将每个 C++ 行都转移到 Objective-C++。Objective-C++ 可以轻松处理 C++ 代码,您只需更改 .cpp -> .mm,当然,还需要重新编写一些与 UI 相关的代码。我认为,这里最好的方法是从 XCode 创建一个空白的 Cocoa 应用程序,并逐步用旧代码填充它。首先让您使用 Cocoa 应用程序使用 OpenGL 的东西,而不是传输重命名文件的 C++ 代码。

提示:你可以用“空白声明”覆盖你的代码的某些部分,即定义一个空的宏而不是真正的函数,如果真的有必要的话,用一个空的方法放置一些空白类。编译所有的东西是第一步,也是重要的一步。当一切都编译时 - 将另一部分真实代码放入项目并修复它以进行编译。

不幸的是,我不知道更好的解决方案。我已经多次重构大型项目,而且每次在每个平台和编程语言上,配方都是一样的。祝你好运!

于 2011-01-13T17:18:40.123 回答
0

我正在编写一个类似的应用程序,但因为我打算让它成为跨平台(主要是 Mac,然后是 Windows),所以我故意将后端保留为 C++ 库。然后,我将提供任何合适的前端 GUI(Mac 上的 Cocoa 和 Windows 上的 MFC)。无需转换 - 您只需整合已有的内容。

于 2011-01-15T09:21:49.413 回答
0

即使这是一个旧帖子,我还没有看到这个答案。

你的代码

int main() {
     ofSetupOpenGL(320,300, OF_WINDOW);
     ofRunApp(new testApp()); 
}

看起来像开放框架代码。您为什么不在这里下载 Open Frameworks Mac XCode 版本并尝试将您的源代码放在他们的示例项目之一中。例如OpenGL的flockingExample?

于 2011-10-13T09:49:38.203 回答