我一直试图动态地将GLEW和GLFW链接到某些tutorial code并且遇到问题。
首先,设计问题:正确的方法是什么?如果我想在二进制和源代码中使用GLFW3分发OpenGL应用程序,那么它应该是什么以及如何使用它?我想一个静态链接的GLFW和GLEW。但是GLU,GL和其他未来的库(glm,SOIL等)呢?混合和匹配静态和动态在某些时候必须变得不安全,对吗?
第二,我目前面临的具体问题。我已经尝试了我在这个简单的Makefile上可以想到的每个变体,但是每次都有一些未定义的符号或完全丢失的库。
BINS = $(basename $(wildcard *.cpp))
CPP = g++
CFLAGS += -fdiagnostics-color -Wall -Wextra -std=c++11 -static-libstdc++
STATIC_DIRS := -I./static -L./static
STATIC_LFLAGS := -Wl,--verbose -Wl,-Bstatic -lGLEW -lglfw
DYNA_LFLAGS := -Wl,-Bdynamic -lrt -lm -lXrandr -lXrender -lXi -lGLU -lm -lGL -lm -lpthread -ldl -ldrm -lXdamage -lXfixes -lX11-xcb -lxcb-glx -lxcb-dri2 -lxcb-dri3 -lxcb-present -lxcb-randr -lxcb-xfixes -lxcb-render -lxcb-shape -lxcb-sync -lxshmfence -lXxf86vm -lXext -lX11 -lpthread -lxcb -lXau -lXdmcp
all:
$(MAKE) $(BINS)
%: %.cpp
$(CPP) $(CFLAGS) $(STATIC_DIRS) $(STATIC_LFLAGS) $(DYNA_LFLAGS) -o $@ $@.cpp
.PHONY: clean
clean:
rm -f $(BINS) *~
这会对调用的每个GLEW和GLFW函数以及glClear()
等GL函数产生未定义的引用。 $(DYNA_LFLAGS)
变量是pkg-config
所说的GLEW和GLFW3需要静态链接的,尽管我不确定为什么标准的OpenGL函数如果那些LFLAGS实际工作就无法被调用。最后,如果我删除了-static-libstdc++
我从ld
收到关于libgcc_s.a
的错误(虽然-static-libgcc
似乎也解决了这个问题?)。
目前的目录层次结构是
/source.cpp
/Makefile
/static/
/static/libGLEW.a
/static/libglfw3.a
/static/GL/
/static/GL/glew.h
/static/GLFW/
/static/GLFW/glfw3.h
这意味着make
可以找到库和包含。确实,ld
通知:
attempt to open ./static/libGLEW.a succeeded
attempt to open ./static/libglfw.a succeeded
那么问题是什么?而且,我是否正确地接近这个?