linux g 未定义的引用,未定义的引用上G ++的Linux

我试图建立我的openGL的项目链接静态libSOIL.a,所有的工作顺利,直到我试图用为土库(http://www.lonesock.net/soil.html)从图像加载纹理。这个库带有一个SOIL.h和一个libSOIL.a文件。未定义的引用上G ++的Linux

这就是我得到这样做时:

g++ -I./src -Wl,-rpath,./lib -O3 -g -c -o src/main.o src/main.cpp

g++ -I./src -Wl,-rpath,./lib -O3 -g -c -o src/file_ply_stl.o src/file_ply_stl.cpp

g++ -I./src -Wl,-rpath,./lib -O3 -g -c -o src/Proyecto.o src/Proyecto.cpp

g++ -I./src -Wl,-rpath,./lib -O3 -g -c -o src/Clock.o src/Clock.cpp

g++ -I./src -Wl,-rpath,./lib -O3 -g -c -o src/utils.o src/utils.cpp

...

g++ -I./src -Wl,-rpath,./lib -O3 -g -c -o src/primitives/cilindro.o src/primitives/cilindro.cpp

g++ -I./src -Wl,-rpath,./lib -O3 -g -c -o src/primitives/cono.o src/primitives/cono.cpp

g++ -I./src -Wl,-rpath,./lib -O3 -g -o app -L./lib src/main.o src/file_ply_stl.o src/Proyecto.o src/Clock.o src/utils.o src/Window.o src/Light.o src/Material.o src/PlyModel.o src/Placeable.o src/Moveable.o src/Model.o src/Texture.o src/Geometry.o src/TriGeometry.o src/TriIndGeometry.o src/Entity.o src/Camera.o src/Bounded.o src/Animatable.o src/Scene.o src/Graphics.o src/Vert.o src/Path.o src/Ant.o src/Tank.o src/Chess.o src/primitives/tetra.o src/primitives/cubo.o src/primitives/cilindro.o src/primitives/cono.o -lsfml-window -lsfml-system -lX11 -lXext -lXmu -lXi -lXt -lSM -lICE -lGLU -lGL -lglut -lSOIL

src/Texture.o: In function `Texture::ini(char const*)':

/home/roger/t/ig/prac/proyecto/src/Texture.cpp:9: undefined reference to `SOIL_load_OGL_texture'

collect2: ld devolvió el estado de salida 1

make: *** [app] Error 1

这就是我的Makefile:

TARGET = app

MODULES = src/main.o src/file_ply_stl.o src/Proyecto.o src/Clock.o src/utils.o

ENGINE = src/Window.o src/Light.o src/Material.o src/PlyModel.o src/Placeable.o src/Moveable.o src/Model.o src/Texture.o src/Geometry.o src/TriGeometry.o src/TriIndGeometry.o src/Entity.o src/Camera.o src/Bounded.o src/Animatable.o src/Scene.o src/Graphics.o src/Vert.o

GAME = src/Path.o src/Ant.o src/Tank.o

PRIMITIVES = src/Chess.o src/primitives/tetra.o src/primitives/cubo.o src/primitives/cilindro.o src/primitives/cono.o

CXX = g++

LIBDIR = ./lib

INCDIR = ./src

LIBS = -lsfml-window -lsfml-system -lX11 -lXext -lXmu -lXi -lXt -lSM -lICE -lGLU -lGL -lglut -lSOIL

LDFLAGS = -L$(LIBDIR)

CXXFLAGS = -I$(INCDIR) -Wl,-rpath,$(LIBDIR) -O3 -g

$(TARGET): $(MODULES) $(ENGINE) $(GAME) $(PRIMITIVES)

$(CXX) $(CXXFLAGS) -o $(TARGET) $(LDFLAGS) $(MODULES) $(ENGINE) $(GAME) $(PRIMITIVES) $(LIBS)

clean:

rm -f $(MODULES) $(ENGINE) $(GAME) $(PRIMITIVES) $(TARGET)

这就是我的文件层次结构:

.:

lib Makefile src

./lib:

libsfml-audio.so libsfml-graphics.so.2.0 libsfml-system.so.2 libSOIL.a

libsfml-audio.so.2 libsfml-network.so libsfml-system.so.2.0 libSOIL.a.1

libsfml-audio.so.2.0 libsfml-network.so.2 libsfml-window.so libSOIL.a.1.0

libsfml-graphics.so libsfml-network.so.2.0 libsfml-window.so.2

libsfml-graphics.so.2 libsfml-system.so libsfml-window.so.2.0

./src:

Animatable.cpp Clock.cpp Light.cpp Moveable.h random.h TriGeometry.h

Animatable.h Clock.h Light.h Path.cpp Scene.cpp TriIndGeometry.cpp

Ant.cpp Entity.cpp main.cpp Path.h Scene.h TriIndGeometry.h

Ant.h Entity.h main.h Placeable.cpp SFML utils.cpp

Bounded.cpp file_ply_stl.cpp Material.cpp Placeable.h SOIL utils.h

Bounded.h file_ply_stl.h Material.h PlyModel.cpp Tank.cpp Vert.cpp

Camera.cpp Geometry.cpp matrix.h PlyModel.h Tank.h vertex.h

Camera.h Geometry.h Model.cpp primitives Texture.cpp Vert.h

Chess.cpp Graphics.cpp Model.h Proyecto.cpp Texture.h Window.cpp

Chess.h Graphics.h Moveable.cpp Proyecto.h TriGeometry.cpp Window.h

./src/primitives:

...

./src/SFML:

...

./src/SFML/Audio:

...

./src/SFML/Graphics:

...

./src/SFML/Network:

...

./src/SFML/System:

...

./src/SFML/Window:

...

./src/SOIL:

SOIL.h

我不知道什么是继续,以及为什么编译器没有找到库文件。 我已经得到的#include“土/ SOIL.h”在Texture.h和Texture.cpp调用SOIL_load_OGL_texture:9,这是因为在SOIL.h.定义的函数名称¿我做得不好?

编辑

我用提供的库,我编译它自己和它的工作。

2012-06-05

rogelius

+0

libSOIL.a是符号链接到libSOIL.a.1 // libSOIL.a.1是符号链接到libSOIL.a.1.0 // libSOIL.a.1.0是静态库// 我试过只留下libSOIL.a作为库的名称(无链接),而同样的情况...... –

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Linux未定义引用是指在编译程序时,出现了无法找到某个函数或变量的定义的情况。这通常是由于程序中使用了未声明的函数或变量,或者链接库文件未正确引用导致的。解决方法包括添加头文件、声明函数或变量、检查链接库文件等。 ### 回答2: "未定义引用" 是指在编译或链接阶段出现的错误,表示程序中存在对某个符号的引用,但没有找到该符号的定义。在Linux环境中,这种错误通常是由以下几种情况造成: 1. 缺少库文件:某些函数或变量的定义可能包含在某个库文件中,但在编译或链接过程中没有正确指定该库文件。解决方法是通过编译选项 `-l` 指定相关的库文件,或者将库文件路径添加到 `LD_LIBRARY_PATH` 环境变量中。 2. 函数或变量定义在其他源文件中:某个函数或变量的定义可能在其他源文件中,但没有将该文件编译并链接到最终的可执行文件中。解决方法是将该源文件添加到编译过程中,或者使用合适的链接选项进行链接。 3. 定义被错误地放置在不正确的位置:在程序中,函数或变量的定义通常应该出现在其首次引用之前。如果定义放置在不正确的位置(如在函数内部),则会导致未定义引用错误。解决方法是将定义放置在正确的位置,或者在引用之前提前声明函数或变量。 4. 编译器版本不支持某些函数或特性:某些函数或特性可能是在较新的编译器版本中引入的,如果使用的编译器版本不支持,就会出现未定义引用错误。解决方法是更新编译器版本或使用适用于当前编译器版本的代码。 以上是常见的几种造成"未定义引用"错误的情况,在解决该错误时,可以根据具体的错误信息和上述原因逐一排查,找到具体的解决方法。 ### 回答3: 当我们在编译Linux内核或者其他的Linux软件时,有时会出现"未定义引用"的错误信息。这个错误通常发生在链接过程中,意味着某个函数或变量的定义未被找到。 造成“未定义引用”的原因主要有以下几点: 1. 缺少源代码文件:在编译链接过程中,如果遗漏了某个源代码文件,就会出现未定义引用的错误。解决这个问题的方法是检查项目文件结构,确认所有必要的源代码文件都被包含在内。 2. 缺少库文件:有时,在编译链接过程中,我们会使用第三方库来调用特定的函数或变量。如果缺少这些库文件,就会出现未定义引用的错误。解决这个问题的方法是确认所需的库文件是否存在,并将其正确地链接到项目中。 3. 函数或变量声明错误:当我们在源代码中定义一个函数或变量时,必须在使用它们之前进行声明。如果未正确声明函数或变量,链接过程就无法找到其定义,从而导致未定义引用的错误。解决这个问题的方法是检查相关的函数或变量声明,确保它们的命名和类型与其定义一致。 4. 编译选项问题:在使用gcc等编译器时,我们可以通过编译选项来指定需要链接的库文件。如果编译选项不正确,链接过程就无法找到函数或变量的定义,从而导致未定义引用的错误。解决这个问题的方法是检查编译选项,确保正确地指定了需要链接的库文件。 综上所述,出现未定义引用的错误通常是由缺少源代码文件、缺少库文件、函数或变量声明错误以及编译选项问题引起的。我们可以通过检查项目文件结构、确认库文件存在与否、检查函数或变量的声明以及检查编译选项来解决这些问题,修复未定义引用的错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值