3

最近、AGIL アドベンチャー ゲーム インタープリターをhttp://www.agidev.com/dl_files/agil-0.1.5.tar.gzからダウンロードしました。

King's Quest のような古い Sierra アドベンチャー ゲームを実行する C プログラムです。

ソースコードをコンパイルして、デバッグしてその仕組みを学ぼうとしています。

しかし、私の最善の努力にもかかわらず、GCC コンパイラは main メソッドを認識しません。

コンパイラの出力は次のとおりです。

make linsdl all 
make -fMakefile.sdl
make[1]: Entering directory `/home/alay/Downloads/AGIL/agil'
gcc -O -Wall -Isrc/include -I/usr/local/include -DTARGET_SDL -fstrength-reduce -fomit-frame-pointer -pedantic -I/usr/local/include/SDL -Dmain=SDL_main -c src/main.c -o bin/main.o
gcc -O -Wall -Isrc/include -I/usr/local/include -DTARGET_SDL -fstrength-reduce -fomit-frame-pointer -pedantic -I/usr/local/include/SDL -Dmain=SDL_main -c src/drivers/sdl.c -o bin/driver.o
gcc -L/usr/local/lib bin/main.o bin/general.o bin/event.o bin/graphics.o bin/menu.o bin/text.o bin/resource.o bin/gameid.o bin/pic_op.o bin/picture.o bin/lzw.o bin/vm.o bin/actionop.o bin/testop.o bin/status.o bin/object.o bin/view.o bin/check.o bin/save.o bin/message.o bin/sound.o bin/decomp.o bin/driver.o \
        -o bin/agil -lm  -lSDLmain -lSDL -lpthread
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o: In function `_start':
make[1]: Leaving directory `/home/alay/Downloads/AGIL/agil'
(.text+0x20): undefined reference to `main'
collect2: ld returned 1 exit status
make[1]: *** [all] Error 1
make: *** [linsdl] Error 2

私が行った変更は、コンパイラが SDL ライブラリを見つけられるように include ステートメントを変更したことだけです。たとえば、次を に変更#include "SDL.h"しました#include "SDL/SDL.h"

私の目標は、別のプラットフォームで同様のものを構築できるように、C コードを理解することです。

4

1 に答える 1

1

は、コードに-Dmain=SDL_maina を持つことと同じです。#define main SDL_mainプリプロセッサはメインを SDL_main に置き換えますが、リンカはそれを見つけられません (存在しないため)。

実行gcc -E ...して、プリプロセッサが実行された後、コンパイラに行く前にコードがどのように見えるかを確認します。

ル:そうですね。しかし、私はそれを引数としてgccに渡しません(そしてヘッダーファイルを変更します)。ただし、インクルード後の定義として。

また、locate libsdl を実行して、パスがリンカに正しく渡されていることを確認します。

于 2013-08-30T13:14:51.533 に答える