如何将复杂的C++ XCode项目转换为Cocoa应用程序?

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中,请告诉我,但目前这似乎对我来说更加复杂。)谢谢!

增加了 Xcode 标签以提高相关性。 - Maxpm
@MikeC8,你在使用Objective-C++吗?如果没有,那么什么都不会起作用。如果你正在使用Obj-C ++,那么你需要将文件更改为.mm而不是.cpp。另外,试试这个阅读材料此处,因为关于Obj-C++实在没有好的指南。 - Stephen Furlani
我不在乎使用什么,我只想将这些C++函数放入Cocoa应用程序中 :) - MikeC8
1
@MikeC8,那么你肯定需要使用Objective-C++,并将文件更改为.mm。这实际上是一个非常复杂的问题。你阅读过这个指南了吗?(http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocCPlusPlus.html#//apple_ref/doc/uid/TP30001163-CH10-SW1) - Stephen Furlani
这是一个与实时摄像头视频流相关的图像检测算法。它旨在在OSX上运行。 - MikeC8
显示剩余3条评论
4个回答

1

嗯,我有两个想法...

  1. 您真的需要Cocoa吗?可以使用QT、wxWidgets等添加Mac支持。
  2. 您不必将每一行C++代码转换为Objective-C++。Objective-C++ 可以轻松处理C++代码,您只需将 .cpp -> .mm,然后相对于UI重新编写一些代码即可。我认为,在这里最好的方法是从 XCode 中创建一个空白的Cocoa应用程序,并逐步填充旧代码。首先使用Cocoa应用程序使您的OpenGL工作正常,然后传输C++代码并重命名文件。

提示:您可以使用“空白声明”来覆盖您代码的某些部分,即定义一个空的宏而不是实际函数,如果必要,放置一些空的类和空的方法。让所有的东西都编译是第一步,也是很大的一步。当一切都编译完成后,将另一部分真正的代码放入项目中并修复它们以进行编译。

不幸的是,我没有更好的解决方案。我曾经多次重构了巨大的项目,每次在每个平台和编程语言上,食谱都是相同的。祝你好运!


1

如果你不懂C++或类似的Cocoa,那么这很可能会出现问题。

否则,如果你知道自己在做什么,大部分转换将是单调的。否则,准备学习一些关于Objective-C的东西。

首先:不要费力将一个正常运行的C++程序实现转换为Objective-C。这是浪费时间。你只需要包装、绑定和修改程序以在该上下文中运行。你不必全部用Objective-C编写。

第二:你将不得不编写一些Objective-C绑定/包装来使用C++程序。你需要进行一些包装工作,特别是对于UI元素和用户事件。

第三:源代码应该按原样编译。你只需将它们添加到新的Cocoa模板项目中,如果它具有被认可的C++扩展名,则gcc将默认将其编译为cpp文件。要使用C++和Objective-C,请使用Objective-C++ FILENAME.mm(你也可以使用.M,但支持程度不如前者)。更好的方法是将原始的cpp源代码放在一个单独的库中,应用程序链接到该库。

第四步:现在你已经有了一个Cocoa项目模板和编译cpp源代码,需要添加包装器/绑定器,以便Cocoa事件/绘图在该上下文中执行。根据你的示例代码,你的起点使用Open GL,因此如果你想要一个Cocoa应用程序,就必须使用类似NSOpenGLView的东西。你需要实现什么完全取决于项目。
你的主函数应该调用NSApplicationMain,然后你编写绑定到c++代码的初始条目可能是事件处理、NSWindow、NSView,以及可能是NSApplication。
如果你是Objc新手,你可能需要一些时间来适应。

0

我正在编写一个类似的应用程序,但由于我希望它能够跨平台(主要是Mac和Windows),所以我故意将后端保留为C++库。然后,我将提供适当的前端GUI(在Mac上使用Cocoa,在Windows上使用MFC)。无需进行转换-您只需要集成您已经拥有的内容即可。


0
尽管这是一篇旧帖子,但我还没有看到这个答案。
你的代码
int main() {
     ofSetupOpenGL(320,300, OF_WINDOW);
     ofRunApp(new testApp()); 
}

看起来是Open Frameworks的代码。为什么不在这里下载Open Frameworks Mac XCode版本,然后尝试将你的源代码放入其中一个示例项目中。例如OpenGL flockingExample?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接