2017-09-19 13 views
2

私はSDL2ライブラリを使用する簡単なプログラムをコンパイルしています。
MWE(Lazy Foo's tutorialの単純化バージョン):SDL2をインクルードするようにMakefileを変更する

// main.cpp 
#include <SDL.h> 
int main(int argc, char* args[]) 
{ 
    SDL_Window* window = NULL; 
    SDL_Surface* screenSurface = NULL; 
    SDL_Init(SDL_INIT_VIDEO); 
    window = SDL_CreateWindow("The exciting white window", DL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_SHOWN); 
    screenSurface = SDL_GetWindowSurface(window); 
    SDL_FillRect(screenSurface, NULL, SDL_MapRGB(screenSurface->format, 0xFF, 0xFF, 0xFF)); 
    SDL_UpdateWindowSurface(window); 
    SDL_Delay(2000); 
    SDL_DestroyWindow(window); 
    SDL_Quit(); 
    return 0; 
} 

私はそれを処理するためにthis tutorialからMakefileを適応したいと思います。
これは私が試したものです:

program_NAME := main 
program_CXX_SRCS := $(wildcard *.cpp) 
program_CXX_OBJS := ${program_CXX_SRCS:.cpp=.o} 
program_OBJS := $(program_CXX_OBJS) 
program_INCLUDE_DIRS := /usr/include/SDL2 
program_LIBRARY_DIRS := 
program_LIBRARIES := SDL2 

CPPFLAGS += $(foreach includedir,$(program_INCLUDE_DIRS),-I$(includedir)) 
LDFLAGS += $(foreach librarydir,$(program_LIBRARY_DIRS),-L$(librarydir)) 
LDFLAGS += $(foreach library,$(program_LIBRARIES),-l$(library)) 

.PHONY: all clean distclean 

all: $(program_NAME) 

$(program_NAME): $(program_OBJS) 
    $(LINK.cc) $(program_OBJS) -o $(program_NAME) 

clean: 
    @- $(RM) $(program_NAME) 
    @- $(RM) $(program_OBJS) 

distclean: clean 

はしかし、私はいくつかのリンカエラーを取得:

$ make 
g++ -I/usr/include/SDL2 -c -o main.o main.cpp 
g++ -I/usr/include/SDL2 -lSDL2 main.o -o myprogram 
main.o: In function `main': 
main.cpp:(.text+0x25): undefined reference to `SDL_Init' 
main.cpp:(.text+0x4a): undefined reference to `SDL_CreateWindow' 
main.cpp:(.text+0x5a): undefined reference to `SDL_GetWindowSurface' 
main.cpp:(.text+0x7d): undefined reference to `SDL_MapRGB' 
main.cpp:(.text+0x90): undefined reference to `SDL_FillRect' 
main.cpp:(.text+0x9c): undefined reference to `SDL_UpdateWindowSurface' 
main.cpp:(.text+0xa6): undefined reference to `SDL_Delay' 
main.cpp:(.text+0xb2): undefined reference to `SDL_DestroyWindow' 
main.cpp:(.text+0xb7): undefined reference to `SDL_Quit' 
collect2: error: ld returned 1 exit status 
Makefile:18: recipe for target 'myprogram' failed 
make: *** [myprogram] Error 1 

私は、引数の順序が今重要なことthis answerからわかります。

$ g++ -I/usr/include/SDL2 -c -o main.o main.cpp 
$ g++ main.o -lSDL2 -o main 

コマンドラインから直接動作します。

最終的に私の質問は何ですか? Makefileを適合させる方法は? (「正しい」とは、上記のMakefileのチュートリアルで言及した落とし穴の種類を避けることを意味します)

答えて

0

あなたが見つけたチュートリアルメイクファイルにエラーがあります。

LDFLAGS += $(foreach library,$(program_LIBRARIES),-l$(library)) 

と::メイクファイルを修正するには、ライン交換する

LDLIBS += $(foreach library,$(program_LIBRARIES),-l$(library)) 

をライン置き換える:

$(LINK.cc) $(program_OBJS) -o $(program_NAME) $(LDLIBS) 

以上の正常で:

$(LINK.cc) $(program_OBJS) -o $(program_NAME) 

としスタイル:

$(LINK.cc) $^ -o [email protected] $(LDLIBS) 

the manual10.5.3 Automatic Variables を参照してください)

チュートリアルメイクファイルでのエラーは、それはそれがない正しく 採用(または説明)正規のメイク変数LDFLAGSLDLIBSを行うことです。 は、すべてのリンカーのライブラリオプション(-l<name>)をLDFLAGSの値にバンドルします。 彼らはそこに行くはずがありません。彼らはLDLIBSの値にする必要があります。

変数LINK.ccがに展開事前に定義されたメイク:ないを行い

LINK.cc = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) 

は(あなたを含む)は、ほとんどのGCCのディストリビューションで使用 として、表示されるようにオブジェクトファイルを必要とし、正確GNUリンカので、$(LDLIBS)が含まれます は、それらが依存するライブラリーよりも先にリンケージ配列内にあり、 は、ライブラリーをシンボル内で解読しないで、ライブラリーを無視します。 リンカーは既に必要です解決を解決してください。

LDLIBSた場合は、正しく-l オプションのために採用され、正しくリンケージレシピに採用されている - 上記修正リンケージレシピのように - そして、すべてのライブラリは、安全にすべてのオブジェクトファイルの後に表示されます。

-lオプションを$(LDFLAGS)にバンドルすると、すべてのオブジェクトファイルの前にすべてのライブラリ が得られます。あなたのリンケージでは、-lSDL2は無視され、あなたの リンケージは、観察されたとおりに失敗します。そのCコンパイラ(デフォルトcc)を呼び出す

CCコマンド

CXXコマンド:ここ

は、標準的なGNUのベビーベッドは、通常、CまたはC++のコンパイルとリンケージで 動作する、変数を作るですあなたのCを呼び出す++コンパイラ(デフォルトg++)C/C++プリプロセッサ

ため

CPPFLAGSあなたのオプション

CFLAGSあなたのCコンパイラのオプションC++コンパイラの

CXXFLAGSあなたのオプション結合のため

LDFLAGSあなたのオプション、除くライブラリとライブラリ( - l)オプション

LDLIBSあなたのリンケージライブラリやライブラリ(-l)オプション

特に指定のない限り、デフォルト値は空です。

10.2 Catalogue of Built-In Rules を参照して、これらの変数がmakeの組み込みルールでどのように機能するかを確認してください。または、 make --print-data-baseの出力をファイルに保存し、調べてください。

関連する問題