【问题标题】:How do I convert a complex C++ XCode project to a Cocoa app?如何将复杂的 C++ XCode 项目转换为 Cocoa 应用程序?
【发布时间】:2011-06-08 03:06:04
【问题描述】:

我有一个相对复杂的 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 标签。
  • @MikeC8,你在使用 Objective-C++ 吗?如果没有,那么什么都不会起作用。如果您使用的是 Obj-C++,那么您需要将文件更改为 .mm 而不是 .cpp。另外,试试这个阅读材料here 确实没有关于 Obj-C++ 的好的指南。
  • 我不在乎我用什么,我只想把这些 C++ 函数放到一个 Cocoa 应用程序中:)
  • @MikeC8,那么您肯定需要使用 Objective-C++,并将文件更改为.mm。这实际上是一个非常复杂的问题。 Have you read this guide yet?
  • @MikeC8,您希望引入什么功能?你只是在移植一个 C++ 程序,然后在上面放一个 Cocoa GUI 吗?这是iphone还是mac?

标签: c++ objective-c cocoa xcode openframeworks


【解决方案1】:

嗯,我有两个想法……

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

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

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

【讨论】:

    【解决方案2】:

    如果你不懂 c++ 或类似的 cocoa,这可能不会顺利。

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

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

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

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

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

    你的 main 函数应该调用 NSApplicationMain,那么你编写绑定到 c++ 代码的初始条目可能是事件处理、NSWindow、NSView,也许还有 NSApplication。

    如果您是 objc 的新手,您可能会有所了解。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        虽然是老帖子,但我还没有看到这个答案。

        你的代码

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-12
          • 1970-01-01
          • 2011-05-28
          • 2010-10-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多