链接对象与g ++时的问题

我想在c ++中用opengl做一个简单的obj加载器。 用一个命令编译一切正常,

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 

是的…所有这些东西都由--libs返回? 您需要这些才能正确链接最终的可执行文件。

sdl-configpkg-config有两个标志:– --cflags--libs 。 当您将源文件编译为目标文件时,需要这些标志中的第一个。 链接时需要使用第二个标志。 当你用一个命令编译所有东西的时候,两个阶段都是由一个命令来处理的,所以你应该同时把--cflags--libs同时--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 $@ .cpp.o: $(CC) $(CFLAGS) $< -o $@ clean: rm -f *.o main 

还有很多关于你的Makefile的批评 – 你可能会在这里消除大部分的操作行,因为GNU Make有内置的含义。 您可能需要添加指定.o文件的依赖关系的规则 – 每个.cpp文件可能包含.h文件,并且需要知道重新编译.cpp文件时依赖于.h文件的更改。

我没有看到任何-llibraryname告诉g ++与opengl链接。 我会希望看到这个建立主要本身(即以'main'结束的行)的g ++行。 据我所知,.o文件本身并不包含有关在哪里可以找到库来解析其引用的信息。 该信息必须以命令行上的-l开关的形式传递。