编译多个C++;OpenGL 我编写了一个简单的C++、OpenGL程序,很难从对象文件中生成可执行文件。我可以使用以下方法创建每个.cpp的对象文件而不会出错: g++ -c filename.cpp ----> filename.o

编译多个C++;OpenGL 我编写了一个简单的C++、OpenGL程序,很难从对象文件中生成可执行文件。我可以使用以下方法创建每个.cpp的对象文件而不会出错: g++ -c filename.cpp ----> filename.o,c++,opengl,compilation,header,g++,C++,Opengl,Compilation,Header,G++,每个.cpp都会创建一个对象,这使我认为它可以很好地找到opengl标题,但当我尝试从这些对象创建可执行文件时,它会输出: g++ -o OUTPUT Main.o Time.o Map.o Vehicle.o Main.o: In function `init()': Main.cpp:(.text+0x12a): undefined reference to `glEnable' Main.cpp:(.text+0x134): undefined reference to `glShade

每个.cpp都会创建一个对象,这使我认为它可以很好地找到opengl标题,但当我尝试从这些对象创建可执行文件时,它会输出:

g++ -o OUTPUT Main.o Time.o Map.o Vehicle.o

Main.o: In function `init()':
Main.cpp:(.text+0x12a): undefined reference to `glEnable'
Main.cpp:(.text+0x134): undefined reference to `glShadeModel'
Main.cpp:(.text+0x14d): undefined reference to `glViewport'
Main.cpp:(.text+0x157): undefined reference to `glMatrixMode'
Main.cpp:(.text+0x15c): undefined reference to `glLoadIdentity'
我意识到g++告诉我,它在任何地方都找不到OpenGL函数,这意味着它没有链接到glu.h、gl.h等。但是为什么创建对象文件时没有类似的错误,但我无法执行?对象文件不会遭受与.exe相同的链接错误吗?我尝试了-I和g++-o运行时.o Main.o Map.o Vehicle.o-L/usr/include/GL/-lGL-lGLU,还验证了OpenGL目录的路径

每个文件的标题如下所示:

libgl.h:

#ifndef LIBGL_H
#define LIBGL_H

#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>
#include "Time.h"
#include "Link.h"

#endif
地图.h

车辆.h:

#ifndef VEHICLE_H
#define VEHICLE_H
#include "libgl.h"
...
#endif
Main.cpp:

#include "libgl.h"
#include "Map.h"
#include "Vehicle.h"
 ...

关于我的标题/链接和编译,我缺少一些东西,如果有人有任何建议,我将不胜感激

您需要链接OpenGL库:可能会将
-lgl
传递到最后一个g++调用

如果系统具有
pkg config
,则可以使用
pkg config--cflags--libs gl
获取所有正确的标志


对于将来的引用,“未定义引用”是一个链接器错误,它总是意味着相同的事情:您丢失了一个对象文件或库。它只在链接时显示,而不在简单编译时显示(即使用
-c

您需要链接OpenGL库:可能会将
-lgl
传递到最后一次g++调用

如果系统具有
pkg config
,则可以使用
pkg config--cflags--libs gl
获取所有正确的标志


对于将来的引用,“未定义引用”是一个链接器错误,它总是意味着相同的事情:您丢失了一个对象文件或库。它只在链接时显示,而不是在简单编译(即使用
-c

时显示,或者您忘记了一个包含functionpkg配置的内联版本的include:“-lGL”。我尝试了“g++-o OUTPUT Main.o Time.o Map.o Vehicle.o-lGL”-->未定义的引用。我认为使用“#include”的全部意义在于,预处理器可以使用路径来查找适当的库/对象,因此,如果我只是使用“g++…-lGL”手动查找库,那么所有的include不是都是多余的吗?如果我去掉“#include”,那么我就不能用“g++-c Main.cpp”-->未定义的引用创建对象文件,那么为什么g++能够创建没有抱怨但不可执行的对象文件呢?
#include
只提供声明。实际代码在某个库中编译,这就是
-lGL
的用途。要编译,它只需要声明。要链接它,需要实际编译的代码,以便它可以。。。嗯,链接到它:)我不知道问题出在哪里……或者你忘记了一个包含函数pkg配置的内联版本:“-lGL”。我尝试了“g++-o OUTPUT Main.o Time.o Map.o Vehicle.o-lGL”-->未定义的引用。我认为使用“#include”的全部意义在于,预处理器可以使用路径来查找适当的库/对象,因此,如果我只是使用“g++…-lGL”手动查找库,那么所有的include不是都是多余的吗?如果我去掉“#include”,那么我就不能用“g++-c Main.cpp”-->未定义的引用创建对象文件,那么为什么g++能够创建没有抱怨但不可执行的对象文件呢?
#include
只提供声明。实际代码在某个库中编译,这就是
-lGL
的用途。要编译,它只需要声明。要链接它,需要实际编译的代码,以便它可以。。。嗯,链接到:)我不知道问题出在哪里。。。
#ifndef VEHICLE_H
#define VEHICLE_H
#include "libgl.h"
...
#endif
#include "libgl.h"
#include "Map.h"
#include "Vehicle.h"
 ...