3

これは私のメイクファイルです:

CFLAGS = -Wall -pedantic -pedantic-errors -g -lSDL -lSDL_image
CC = g++
OBJ = Point.o Personaje.o Juego.o EventHandler.o

all: main

#%.o: %.cpp %.h
#   $(CC) -c $(CFLAGS) $<

bin: other $(OBJ)

Point.o: Point.cpp Point.h
    $(CC) -c $(CFLAGS) $<

Personaje.o: Personaje.cpp Personaje.h
    $(CC) -c $(CFLAGS) $<

Juego.o: Juego.cpp Juego.h
    $(CC) -c $(CFLAGS) $<

EventHandler.o: EventHandler.cpp EventHandler.h
    $(CC) -c $(CFLAGS) $<

main: $(OBJ)
    cd ../vista/; make
    cp ../vista/*.o .
    rm ../vista/*.o
    g++ $(CFLAGS) $(OBJ) Pantalla.o Imagen.o main.cpp -o main

clean:
    rm *.o;
    rm main

PHONY: main

「make」でコンパイルすると、次のエラーが発生します。

EventHandler.cpp:17: undefined reference to `SDL_PollEvent'
Pantalla.o: In function `Pantalla::initialize(int, int, int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
Pantalla.cpp:6: undefined reference to `SDL_Init'
Pantalla.cpp:9: undefined reference to `SDL_SetVideoMode'
Pantalla.cpp:14: undefined reference to `SDL_WM_SetCaption'

および他の多くのエラー。

「Pantalla.h」のヘッダーには、次の行が含まれています。

#include "SDL/SDL.h"

そして、私はすでにSDLパッケージをインストールしました。

何が間違っているのかわかりません...助けてください!

4

2 に答える 2

5
CFLAGS = -Wall -pedantic -pedantic-errors -g -lSDL -lSDL_image

これは良くありません。コンパイラ フラグ (警告とデバッグ) とリンカー情報 (どのライブラリにリンクする必要があるか) を混在させています。そのためには、2 つの個別の変数を使用します。

CFLAGS = -Wall -pedantic -pedantic-errors -g
LIBS = -lSDL -lSDL_image

.o次に、コンパイルするとき(ただし、ファイルを生成するときはリンクしません)、使用するだけ$(CFLAGS)です(今のように)。ただし、(最終的な実行可能ファイルを生成するために) リンクするときは、リンカー ディレクティブを追加します。

g++ $(CFLAGS) -o main main.cpp $(OBJ) Pantalla.o Imagen.o $(LIBS)

オブジェクトとライブラリを配置する順序は重要です。

于 2012-09-02T16:13:27.380 に答える
2

問題の 1 つは、コンパイルとリンクにまったく同じフラグを使用していることです。コンパイラはライブラリを使用しません。リンカーはペダンティックについて知りません。

より大きな問題は-lSDL -lSDL_image、リンク コマンドg++ $(CFLAGS) $(OBJ) Pantalla.o Imagen.o main.cpp -o main. 検索を指定した時点で未解決の外部参照がないため、リンカは libSDL.a または libSDL_image.a (または同等のもの) を調べません。-lSDL -lSDL_imageオプションはオプションの直前に置き-oます。

于 2012-09-02T16:12:52.110 に答える