首页 文章

无法链接到libglew或libglfw

提问于
浏览
0

我正在关注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

它可以编译但不能链接 .

$ 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

该文件肯定有无法链接的符号:

$ readelf -Ws /usr/lib/x86_64-linux-gnu/libGLEW.so | grep glewInit
1146: 000000000005f2f0 38819 FUNC    GLOBAL DEFAULT   10 glewInit

发生什么了?为什么链接器无法找到该符号?

1 回答

  • 1

    对于旧的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
    

    由于implcit规则,您根本不必编写实际命令,只需设置所需的变量即可 .

相关问题