【问题标题】:Compiling Multiple C++ OpenGL编译多个 C++ OpenGL
【发布时间】:2012-05-31 16:46:15
【问题描述】:

我正在编写一个简单的 C++、opengl 程序,但我很难从目标文件生成可执行文件。我可以使用以下方法创建每个 .cpp 的目标文件而不会出错:

g++ -c filename.cpp  ---->   filename.o

每个 .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 RUN Time.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:

#ifndef TIME_H
#define TIME_H

extern float GLOBAL_TIME;

#endif

地图.h

#ifndef MAP_H
#define MAP_H
#include "libgl.h"
....
#endif

车辆.h:

#ifndef VEHICLE_H
#define VEHICLE_H
#include "libgl.h"
...
#endif

Main.cpp:

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

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

【问题讨论】:

    标签: c++ opengl compilation header g++


    【解决方案1】:

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

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

    为了将来的参考,“未定义的引用”是一个链接器错误,它总是意味着同样的事情:你错过了一个目标文件或一个库。它只在链接时出现,在简单编译时(即使用-c)时不会出现

    【讨论】:

    • 或者你忘记了包含函数的内联版本
    • pkg-config 产生:“-lGL”。我试过“g++ -o OUTPUT Main.o Time.o Map.o Vehicle.o -lGL”——>未定义的参考。我认为拥有“#include ”的全部意义在于预处理器可以使用 PATH 来查找适当的库/对象,所以如果我只是去的话,所有的包含不是都是多余的使用“g++ ....-lGL”手动查找库?如果我把“#include ”去掉,那么我不能用“g++ -c Main.cpp”--->未定义的引用创建对象文件,那么为什么g++能够创建对象没有投诉但无法执行的文件?
    • #include 只为您带来声明。实际代码在某个库中编译,这就是 -lGL 的用途。要编译,它只需要声明。要链接它需要实际编译的代码,以便它可以......好吧,链接到它:)我不知道问题是什么......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 2013-11-15
    相关资源
    最近更新 更多