1

メイクファイルとコマンドライン ツールを使用して、ソフトウェアを構築するためのシステムが既にセットアップされています。

Mac (現在は 10.7.4) をサポートするように makefile を簡単に変更できたので、XCode とは独立してコードを動作させようとしています。iOS への移植を開始したら、XCode を扱います。私の希望は、makefile ソリューション (私のコードベースは上記の makefile でまだ管理可能ですが) により、移植性と自動化のためのより良いオプションが得られることです。

私はまさにここで説明されていることを経験しています。コードがコンパイルされ、実行時に問題が発生します。

最初は-framework SDL、SDL サイトのバイナリ ダウンロードから SDL フレームワーク ( ) を使用していたので、ソースから SDL を適切にビルドすることで問題を解決できると考えました。私はこれを行い、現在 と にリンクしlibSDL.alibSDLMain.aいます。これには、正常にコンパイルするためにこれらの追加のフレームワークを含める必要があります (次の出力に基づいてリストを思いつきましたsdl-config --static-libs:

-framework Cocoa -framework IOKit -framework AudioToolbox -framework AudioUnit -framework Carbon -framework ApplicationServices 

ただし、私はまだ同じ問題を抱えています。記事では、これを見逃していることが原因であると説明しています。

[NSApplication sharedApplication];

私のコードには Obj-C コードがありません。ただし、いくつかの Obj-C をプラグインできることをうれしく思います。パッケージの1つに付属していることを追加SDLMain.mしましたが、リンカーには問題があります:ld: duplicate symbol _main

わかりました、だから私はそれを簡単に逃れるつもりはありません。

NSApplication を初期化するために欠けている小さなピースは何ですか? Main.cppObj-C でなければならない(my からの) 別のソース ファイルを持たずにそれを行う方法はありますか? 呼び出すことができる C/C++ ラッパー関数はありsharedApplicationますか?

4

3 に答える 3

2

とリンクしlibSDLmainたり、 をインクルードしたりする場合SDLMain.m、代わりにエントリ ポイントを SDL_main という名前にする必要があります。

extern "C" int SDL_main(int argc, char **argv)
{
}

(extern "C"は、C++ を使用しているという事実を考慮に入れています。)

またはmainに含まれる「本物の」は、必要な Mac 固有の準備を行い、 を呼び出します。libSDLmainSDLMain.mSDL_main

于 2012-06-10T00:04:19.330 に答える
2

これに対する純粋な C ソリューションもあります。Objective-C 呼び出しを C 呼び出しまたは一連の C 呼び出しに下げるというコンパイラーの作業を行います。

#include <objc/runtime.h>
#include <objc/message.h>

static void createSharedApplication(void)
{
    id myNSApplication = objc_getClass("NSApplication");
    SEL mySharedApplication = sel_registerName("sharedApplication");
    id (*myMsgSend)(id, SEL) = (id (*)(id, SEL))objc_msgSend;

    myMsgSend(myNSApplication, mySharedApplication);
}

ただし、ご覧のとおり、これはあまりエレガントではありません。

于 2012-06-10T00:10:50.777 に答える
0

RavuAlHemio は、エントリ ポイントで SDL が行っている (行おうとしている) ことについて十分な情報を提供してくれました。次に、コードをわずかに編集しました。

#undef main
int main(int argc,char *argv[]) {

int main(int argc,char *argv[]) {

私が最初の方法をとった唯一の理由は、MinGW経由のWindows(Linuxではなく)stdoutとstderrが端末に置かれるのではなくファイルにリダイレクトされたためです。そのためのよりエレガントなソリューションを考え出す必要があります。

とにかく、これで問題は解決しました。

于 2012-06-10T00:15:12.167 に答える