Невозможно связаться с libglew или libglfw - PullRequest
0 голосов
/ 08 декабря 2018

Я следую (модифицированной) версии этого учебного руководства по OpenGL .

С этим тривиальным исходным файлом:

#include <GL/glew.h>

int main() {
    glewInit();
}

И этот make-файл:

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 Ответ

0 голосов
/ 08 декабря 2018

Для старого компоновщика 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 вам вообще не нужно писать реальные команды, просто установите нужные переменные.

...