2012-05-06 5 views
2

私は、C++でopenglで単純なobjローダーを作ろうとしています。 1つのコマンドですべてが正常に動作してコンパイル 、オブジェクトをg ++とリンクするときの問題

g++ -o main main.cpp timer.cpp screen.cpp obj_loader.cpp `sdl-config --cflags --libs` `pkg-config --cflags --libs glu` 

リターンエラーなし。個別のオブジェクトをコンパイル

g++ main.cpp -o main.o -c -Wall `sdl-config --cflags --libs` `pkg-config glu --cflags --libs` 
g++ obj_loader.cpp -o obj_loader.o -c -Wall `sdl-config --cflags --libs` `pkg-config glu --cflags --libs` 
g++ timer.cpp -o timer.o -c -Wall `sdl-config --cflags --libs` `pkg-config glu --cflags --libs` 
g++ screen.cpp -o screen.o -c -Wall `sdl-config --cflags --libs` `pkg-config glu --cflags --libs` 

もエラーを返しません、あまりにも正常に動作します。最終

g++ main.o obj_loader.o timer.o screen.o -o main 

を実行しているときに

はしかし、私は未定義の参照エラーの束を得る:

main.o: In function `draw()': 
main.cpp:(.text+0x1d): undefined reference to `glColor3f' 
main.cpp:(.text+0x27): undefined reference to `glBegin' 
main.cpp:(.text+0x36): undefined reference to `glVertex2i' 
main.cpp:(.text+0x45): undefined reference to `glVertex2i' 
main.cpp:(.text+0x54): undefined reference to `glVertex2i' 
main.cpp:(.text+0x63): undefined reference to `glVertex2i' 
main.cpp:(.text+0x68): undefined reference to `glEnd' 
main.o: In function `main': 
main.cpp:(.text+0xf8): undefined reference to `SDL_PollEvent' 
main.cpp:(.text+0x10b): undefined reference to `glClear' 
main.cpp:(.text+0x115): undefined reference to `SDL_GL_SwapBuffers' 
main.cpp:(.text+0x11a): undefined reference to `glFinish' 
main.cpp:(.text+0x14e): undefined reference to `SDL_Delay' 
timer.o: In function `Timer::start()': 
timer.cpp:(.text+0x4d): undefined reference to `SDL_GetTicks' 
timer.o: In function `Timer::pause()': 
timer.cpp:(.text+0xa6): undefined reference to `SDL_GetTicks' 
timer.o: In function `Timer::unpause()': 
timer.cpp:(.text+0xe5): undefined reference to `SDL_GetTicks' 
timer.o: In function `Timer::tick()': 
timer.cpp:(.text+0x136): undefined reference to `SDL_GetTicks' 
timer.o: In function `Timer::get_ticks()': 
timer.cpp:(.text+0x172): undefined reference to `SDL_GetTicks' 
screen.o: In function `init()': 
screen.cpp:(.text+0xa): undefined reference to `SDL_Init' 
screen.cpp:(.text+0x31): undefined reference to `SDL_SetVideoMode' 
screen.cpp:(.text+0x64): undefined reference to `SDL_WM_SetCaption' 
screen.o: In function `init_GL()': 
screen.cpp:(.text+0x80): undefined reference to `glClearColor' 
screen.cpp:(.text+0x8a): undefined reference to `glMatrixMode' 
screen.cpp:(.text+0x8f): undefined reference to `glLoadIdentity' 
screen.cpp:(.text+0xc0): undefined reference to `glOrtho' 
screen.cpp:(.text+0xca): undefined reference to `glMatrixMode' 
screen.cpp:(.text+0xcf): undefined reference to `glLoadIdentity' 
screen.cpp:(.text+0xd4): undefined reference to `glGetError' 
screen.o: In function `clean_up()': 
screen.cpp:(.text+0xf4): undefined reference to `SDL_Quit' 
collect2: ld returned 1 exit status 

マイ含まれたライブラリは、以下のとおりです。

#include <iostream> 
#include <fstream> 
#include <string> 
#include <vector> 

#include "SDL/SDL.h" 
#include "SDL/SDL_opengl.h" 

#include "GL/gl.h" 
#include "GL/glu.h" 

と私のMakefile:

CC=g++ 
SDL_FLAGS=`sdl-config --cflags --libs` 
GL_FLAGS=`pkg-config glu --cflags --libs` 

CFLAGS=-c -Wall 

FLAGS=$(CFLAGS) $(SDL_FLAGS) $(GL_FLAGS) 
LDFLAGS= 

SOURCES=main.cpp obj_loader.cpp timer.cpp screen.cpp 
OBJECTS=$(SOURCES:.cpp=.o) 
EXECUTABLE=main 

all: $(SOURCES) $(EXECUTABLE) 

$(EXECUTABLE): $(OBJECTS) 
    $(CC) $(OBJECTS) -o [email protected] $(LDFLAGS) 

.cpp.o: 
    $(CC) $< -o [email protected] $(FLAGS) 

clean: 
    rm -f *o main 
+0

例として挙げたコマンドライン、うまくいかないコマンドラインは、必要なライブラリをリンクしていることを示すものではありませんが、動作するものはありません。あなたのMakefileはまったく同じ問題を抱えているようです。私はそれが動作するとは思わないでしょう。 –

答えて

2

ええと...これらすべてのものは--libsで返されますか?最終的な実行ファイルを正しくリンクするためにはそれらが必要です。

0

openglとリンクするにはg ++に指示するために-llibrarynameは表示されません。私はこれをmain(つまりmainで終わる行)を構築するg ++行で見ることが期待されます。私の知る限り、.oファイル自体には、参照を解決するためのライブラリの場所に関する情報は含まれていません。その情報は、コマンドラインでスイッチ-lとして渡す必要があります。

1

sdl-configおよびpkg-configは、2つのフラグ:--cflagsおよび--libsをとります。これらのフラグの最初は、ソースファイルをオブジェクトファイルにコンパイルするときに必要です。これらのフラグの2番目は、リンクするときに必要です。 1つのコマンドですべてをコンパイルすると、両方のフェーズが1つのコマンドで処理されるため、同時に--cflags--libssdl-configpkg-configの両方に渡す必要がありました。これらの段階を分けたので、適切なオプションをsdl-configpkg-configに適時に渡す必要があります。あなたのmakefileで

g++ main.cpp -o main.o -c -Wall `sdl-config --cflags` `pkg-config glu --cflags` 
g++ obj_loader.cpp -o obj_loader.o -c -Wall `sdl-config --cflags` `pkg-config glu --cflags` 
g++ timer.cpp -o timer.o -c -Wall `sdl-config --cflags` `pkg-config glu --cflags` 
g++ screen.cpp -o screen.o -c -Wall `sdl-config --cflags` `pkg-config glu --cflags` 

g++ main.o obj_loader.o timer.o screen.o -o main `sdl-config --libs` `pkg-config glu --libs` 

が、これは次のように変数を設定する意味:(私もあなたのMakefileに他のいくつかのマイナーな修正を加えました)

CC=g++ 
LD=g++ 

CFLAGS=-c -Wall $(shell sdl-config --cflags) $(shell pkg-config glu --cflags) 
LDFLAGS=$(shell sdl-config --libs) $(shell pkg-config glu --libs) 

SOURCES=main.cpp obj_loader.cpp timer.cpp screen.cpp 
OBJECTS=$(SOURCES:.cpp=.o) 
EXECUTABLE=main 

all: $(EXECUTABLE) 

$(EXECUTABLE): $(OBJECTS) 
    $(LD) $(LDFLAGS) $(OBJECTS) -o [email protected] 

.cpp.o: 
    $(CC) $(CFLAGS) $< -o [email protected] 

clean: 
    rm -f *.o main 

があなたのMakefileについて批判する方がたくさんあります - GNU Makeはそれらを暗黙的に組み込んでいるので、おそらくほとんどのアクション行をここで取り除くことができます。 .oファイルの依存関係を指定するルールを追加する必要があります。それぞれのファイルに.hファイルが含まれている可能性があります。.hファイルが変更に依存する場合、.cppファイルを再コンパイルする必要があります。

+0

makefileは 'CFLAGS:= $(shell sdl-config --cflags)など'を使って、コンパイルされた.oすべてに対してバックティックシェルコマンドを再実行しないようにすることができます。 –

+0

@JonathanWakely:done。 –

関連する問題