2012-05-06 12 views
2

我想在C++中用opengl做一個簡單的obj加載器。 編譯一切用一個命令工作正常,與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

我沒有看到任何-llibraryname告訴g ++與opengl鏈接。我希望在構建主體本身的g ++行(即以'main'結尾的行)看到這一點。據我所知,.o文件本身並不包含有關在哪裏找到庫來解析其引用的信息。該信息必須在命令行中作爲-l開關傳入。

1

sdl-configpkg-config取兩個標誌:--cflags--libs。當您將源文件編譯爲目標文件時,需要這些標誌中的第一個。鏈接時需要第二個標誌。當您使用單個命令編譯所有內容時,兩個階段都由單個命令處理,因此您應該同時通過--cflags--libssdl-configpkg-config是自然的。現在您已將這些階段分開,您需要在正確的時間將正確的選項傳遞給sdl-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 [email protected] 

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

clean: 
    rm -f *.o main 

還有其它更多的批判你的Makefile - - 你可能會在這裏消除大部分的操作行,因爲GNU Make有內置的含義。您可能需要添加指定.o文件的相關性的規則 - 每個.cpp文件可能包含.h文件,並且需要知道在.h文件取決於更改時重新編譯.cpp文件。

+0

生成文件可以使用'CFLAGS:= $(shell sdl-config --cflags)等'來避免爲編譯的每個.o重新運行反引號shell命令。 –

+0

@JonathanWakely:完成。 –

相關問題