不能 link 到 libglew 或 libglfw
Cannot link to libglew or libglfw
我正在关注 this OpenGL tutorial 的(修改)版本。
有了这个简单的源文件:
#include <GL/glew.h>
int main() {
glewInit();
}
还有这个 makefile:
cflags=-ggdb -Wall -std=c++17
all: 01
01: 01.o makefile
g++ $(cflags) $(shell pkg-config --libs glew glfw3 glm) -o $@ $<
01.o: 01.cpp makefile
g++ $(cflags) $(shell pkg-config --cflags glew glfw3 glm) -o $@ $< -c
# The following have pkg-config entries:
# x11 xext glu glfw3 glew glm
可以编译但不能link。
$ make
g++ -ggdb -Wall -std=c++17 -I/usr/include/libdrm -o 01.o 01.cpp -c
g++ -ggdb -Wall -std=c++17 -lGLEW -lGLU -lGL -lglfw -o 01 01.o
/usr/bin/ld: 01.o: in function `main':
/home/greg/OpenGL_GEOM_2D/01/01.cpp:6: undefined reference to `glewInit'
正在检查 pkg-config
在后台执行的操作:
$ pkg-config --libs glew
-lGLEW -lGLU -lGL
它使用的库在这里:
$ dpkg-query -L libglew-dev
/usr/lib/x86_64-linux-gnu/libGLEW.so
该文件确实包含无法 link:
的符号
$ readelf -Ws /usr/lib/x86_64-linux-gnu/libGLEW.so | grep glewInit
1146: 000000000005f2f0 38819 FUNC GLOBAL DEFAULT 10 glewInit
所以这是怎么回事?为什么 linker 找不到那个符号?
对于旧的 GNU 链接器,命令行上指定的输入顺序很重要。如果在输入目标文件之前或之后指定库,则会有所不同。
为您的 Makefile 试试这个
01: 01.o makefile
g++ -o $@ $< $(shell pkg-config --libs glew glfw3 glm)
顺便说一句,你应该了解隐式规则,你的整个 Makefile 可以替换为:
.PHONY: 01
all: 01
01: LDFLAGS += $(shell pkg-config --libs glew glfw3 glm)
01: 01.o
01.o: CFLAGS += $(shell pkg-config --cflags glew glfw3 glm)
01.o: 01.cpp Makefile
由于隐式规则,您根本不必编写实际命令,只需设置所需的变量即可。
我正在关注 this OpenGL tutorial 的(修改)版本。
有了这个简单的源文件:
#include <GL/glew.h>
int main() {
glewInit();
}
还有这个 makefile:
cflags=-ggdb -Wall -std=c++17
all: 01
01: 01.o makefile
g++ $(cflags) $(shell pkg-config --libs glew glfw3 glm) -o $@ $<
01.o: 01.cpp makefile
g++ $(cflags) $(shell pkg-config --cflags glew glfw3 glm) -o $@ $< -c
# The following have pkg-config entries:
# x11 xext glu glfw3 glew glm
可以编译但不能link。
$ make
g++ -ggdb -Wall -std=c++17 -I/usr/include/libdrm -o 01.o 01.cpp -c
g++ -ggdb -Wall -std=c++17 -lGLEW -lGLU -lGL -lglfw -o 01 01.o
/usr/bin/ld: 01.o: in function `main':
/home/greg/OpenGL_GEOM_2D/01/01.cpp:6: undefined reference to `glewInit'
正在检查 pkg-config
在后台执行的操作:
$ pkg-config --libs glew
-lGLEW -lGLU -lGL
它使用的库在这里:
$ dpkg-query -L libglew-dev
/usr/lib/x86_64-linux-gnu/libGLEW.so
该文件确实包含无法 link:
的符号$ readelf -Ws /usr/lib/x86_64-linux-gnu/libGLEW.so | grep glewInit
1146: 000000000005f2f0 38819 FUNC GLOBAL DEFAULT 10 glewInit
所以这是怎么回事?为什么 linker 找不到那个符号?
对于旧的 GNU 链接器,命令行上指定的输入顺序很重要。如果在输入目标文件之前或之后指定库,则会有所不同。
为您的 Makefile 试试这个
01: 01.o makefile
g++ -o $@ $< $(shell pkg-config --libs glew glfw3 glm)
顺便说一句,你应该了解隐式规则,你的整个 Makefile 可以替换为:
.PHONY: 01
all: 01
01: LDFLAGS += $(shell pkg-config --libs glew glfw3 glm)
01: 01.o
01.o: CFLAGS += $(shell pkg-config --cflags glew glfw3 glm)
01.o: 01.cpp Makefile
由于隐式规则,您根本不必编写实际命令,只需设置所需的变量即可。