我必须在这里遗漏一些东西,这是可以预料到的,因为我刚刚拿到了C ++。但是我正在使用MinGW Make编译一个项目,它总是会出现我怀疑是GLEW库的缺失参考。但是,我有一个几乎相同设置的项目编译得很好。不可否认,问题代码不是我的,而且已经有八年了,但这似乎不是问题所在。
这是工作项目的Makefile:
CXX = C:\MinGW\bin\g++
OBJ = main.o graphics.o
TARGET = bin\helloWorld
LIBHEAD = C:\Cpp\glfw\include C:\Cpp\glew\include C:\Cpp\glm
LIBINCLUDE = C:\Cpp\glfw\lib-mingw C:\Cpp\glew\lib
LIBFILES = glfw3 gdi32 opengl32 glew32
HEADERS += $(LIBHEAD:%=-I%)
LDFLAGS += $(LIBINCLUDE:%=-L%)
LIBS += $(LIBFILES:%=-l%)
$(TARGET): $(OBJ)
$(CXX) -o $@ $^ $(LDFLAGS) $(LIBS)
%.o: %.cc $(DEPS)
$(CXX) -c -o $@ $< $(HEADERS)
这是不起作用的那个:
CXX = C:\MinGW\bin\g++
OBJ = Main.o
TARGET = bin\demo
LIBHEAD = C:\Cpp\freeglut\include C:\Cpp\glew\include C:\Cpp\Tiff\include
LIBINCLUDE = C:\Cpp\freeglut\lib C:\Cpp\glew\lib C:\Cpp\Tiff\lib
LIBFILES = libtiff freeglut opengl32 glew32
HEADERS += $(LIBHEAD:%=-I%)
LDFLAGS += $(LIBINCLUDE:%=-L%)
LIBS += $(LIBFILES:%=-l%)
%.o: %.cpp
$(CXX) -c -o $@ $< $(HEADERS)
$(TARGET): $(OBJ)
$(CXX) -o $@ $^ $(LDFLAGS) $(LIBS)
这是该编译的输出。在编译期间有一个警告,但它生成目标文件就好了:
C:\MinGW\bin\g++ -c -o Main.o Main.cpp -IC:\Cpp\freeglut\include -IC:\Cpp\glew\include -IC:\Cpp\Tiff\include
Main.cpp: In function 'void loadData()':
Main.cpp:225:31: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
loadTIFF("earth.tiff", tex);
^
C:\MinGW\bin\g++ -o bin\demo Main.o -LC:\Cpp\freeglut\lib -LC:\Cpp\glew\lib -LC:\Cpp\Tiff\lib -llibtiff -lfreeglut -lgdi32 -lglu32 -lopengl32 -lglew32
Main.o:Main.cpp:(.text+0x287): undefined reference to `__glewGetShaderiv'
Main.o:Main.cpp:(.text+0x2c0): undefined reference to `__glewGetShaderInfoLog'
Main.o:Main.cpp:(.text+0x373): undefined reference to `__glewCreateProgram'
Main.o:Main.cpp:(.text+0x37d): undefined reference to `__glewCreateShader'
{{ And dozens of similar messages}}
这让我起了墙!我尝试过各种各样的事情。我尝试插入#define GLEW_STATIC
,尝试关联glu32
,gdi32
和glfw3
。我尝试切换旗帜订单。我尝试重建glew并链接那些文件。我尝试将glew32.dll直接拖到项目目录中。它没有改变任何东西。
但是这里变得更加疯狂:我试着搜索控制台中列出的引用,认为它们的名称可能与代码中的函数名称相匹配。他们没有。然后我尝试在线搜索参考文献。谷歌“glewGetShaderiv
”,带引号,看看会出现什么。 什么都没有。没有一个结果。它自动更正为glGetShaderiv
。我测试了其他参考文献。他们中的大多数都是一样的。我不确切知道链接器如何为其引用设置名称,但我怀疑所有这些“gl”都神奇地变成了“glew”。
但即使这可能是一个红色的鲱鱼,因为glewInit()是未知的参考文献之一!我在这里过头了!
答案 0 :(得分:0)
我发现它是什么!所以,我安装了Perl,它包含了自己的gcc和g ++(出于某种原因),并将它们添加到路径中。当我编译GLEW库时,我使用了这些编译器。但是,正如您在makefile中注意到的那样,我指定了MinGW编译器。事实上,当我尝试重新编译我的工作项目时,它失败了,因为我已经从路径中的编译器切换到MinGW编译器。 Perl附带的编译器是64位,MinGW编译器是32位,所以当MinGW编译器试图读取用其他编译器编译的二进制文件时,它找不到正确的引用!这只是向您展示99%的错误完全是人为错误。
当然,现在我的调试问题已经严重过时,但这超出了这个问题的范围。