2

C ++でopenglを使用して単純なobjローダーを作成しようとしています。1 つのコマンドですべてをコンパイルすると正常に動作します。

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 $@ $(LDFLAGS)

.cpp.o:
    $(CC) $< -o $@ $(FLAGS)

clean:
    rm -f *o main
4

3 に答える 3

2

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

于 2012-05-06T04:37:47.357 に答える
1

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

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 では、これは次のように変数を構成することを意味します: (私は 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 $@

.cpp.o:
    $(CC) $(CFLAGS) $< -o $@

clean:
    rm -f *.o main

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

于 2012-05-06T04:54:50.793 に答える
0

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

于 2012-05-06T04:38:16.223 に答える