3

多くのライブラリや依存関係などを含む、比較的複雑な C++ アプリケーションのソース コードがあります。それを取得して、それに Cocoa GUI を追加しようとしています。私はこれまでに次のことに失敗しました:

  • 新しい Cocoa xcodeproj を作成し、すべてのライブラリなどを Cocoa アプリに移動してみてください。私はそれを構築することができません。私が何をしても何千ものエラー。ここでの私のスキルは、何が起こっているのかを理解するのに十分ではありません.

だから、より簡単な方法は、main() 関数が現在行っていることではなく NSApplication を起動するように、C++ xcodeproj に適切な変更を加えることであると考えています。

これを実現するために私が正確に何をしなければならないかを誰かが知っていますか? 私は 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

ええと、私には2つのアイデアがあります...

  1. あなたは本当にココアが必要ですか?Macのサポートは、QT、wxWidgetsなどで追加できます。
  2. すべてのC++行をObjective-C++に転送する必要はありません。目的-C++はC++コードを簡単に処理できます。.cpp->.mmを変更するだけで、もちろん、UIに関連するコードを書き直す必要があります。ここでの最善の方法は、XCodeから空のCocoaアプリを作成し、古いコードを段階的に入力することだと思います。ファイルの名前を変更するC++コードを転送するよりも、まずOpenGLのものをCocoaアプリで動作させます。

ヒント:コードの一部を「空白の宣言」でカバーできます。つまり、実際の関数の代わりに空のマクロを定義し、本当に必要な場合は空のメソッドでいくつかの空白のクラスを配置します。すべてのものをコンパイルすることは、ここでの最初の大きなステップです。すべてがコンパイルされたら、実際のコードの別の部分をプロジェクトに入れて、コンパイルするように修正します。

残念ながら、私はより良い解決策を知りません。私は巨大なプロジェクトを数回リファクタリングしましたが、毎回、すべてのプラットフォームとプログラミング言語でレシピは同じでした。幸運を!

于 2011-01-13T17:18:40.123 に答える
1

おそらく、c++ やそれに類するココアの知識がなければ、これはうまくいかないでしょう。

そうしないと、自分が何をしているのかわかっていれば、移行のほとんどが単調になります。それ以外の場合は、objc についていくつか学ぶ準備をしてください。

まず、機能している C++ プログラムの実装を objc に変換する必要はありません。それは膨大な時間の無駄です。そのコンテキストで動作するように、プログラムをラップ、バインド、および変更するだけです。objc にすべてを記述する必要はありません。

2 番目: c++ プログラムを使用するには、いくつかの objc バインディング/ラッパーを作成する必要があります。特に ui 要素とユーザー イベントについては、いくつかのラッピングを行う必要があります。

3 番目: ソースはそのままコンパイルする必要があります。それらを新しいココア テンプレート プロジェクトに追加するだけで、認識された c++ 拡張子がある場合、gcc はデフォルトでそれを cpp ファイルとしてコンパイルします。c++ と objc を使用するには、objc++ を使用しますFILENAME.mm( も使用できますが.M、これもサポートされていません)。さらに良いことに、元の cpp ソースを、アプリがリンクする別のライブラリに入れます。

4 番目: ココア プロジェクト テンプレートと cpp ソースのコンパイルができたので、ラッパー/バインディングを追加して、ココア イベント/描画がそのコンテキストで実行されるようにします。サンプルコードに基づいて、開始点は Open GL を使用するため、Cocoa アプリが必要な場合は NSOpenGLView などを使用する必要があります。正確に何を実装する必要があるかは、プロジェクトによって異なります。

メイン関数は NSApplicationMain を呼び出す必要があり、C++ コードへのバインドを記述するための最初のエントリは、イベント処理、NSWindow、NSView、およびおそらく NSApplication になる可能性があります。

objc を初めて使用する場合は、おそらく少し慣れているでしょう。

于 2011-01-15T09:56:08.877 に答える
0

古い投稿ですが、この回答はまだ見ていません。

あなたのコード

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

Open Frameworks コードのように見えます。こちらから Open Frameworks Mac XCode エディションをダウンロードして、サンプル プロジェクトの 1 つにソースを配置してみませんか。たとえば、OpenGL flockingExample?

于 2011-10-13T09:49:38.203 に答える
0

私は同様のアプリケーションを作成していますが、クロス プラットフォーム (主に Mac、次に Windows) を意図しているため、バックエンドを意図的に C++ ライブラリとして保持しています。次に、適切なフロントエンド GUI (Mac では Cocoa、Windows では MFC) を提供します。変換する必要はありません。既存のものを統合するだけです。

于 2011-01-15T09:21:49.413 に答える