Общая библиотека с freeglut — неопределенный символ

На самом деле у меня возникают некоторые проблемы при связывании общей библиотеки OpenGL/freeglut (.so) с проектом C++. Я уверен, что проблема в моем Makefile, поскольку код, который я использую для загрузки (используя функции dlopen/dlsym/dlclose), отлично работает с другими разделяемыми библиотеками. Я думал, что это происходит из-за включений заголовков, но проект OpenGL, с которым я пытаюсь работать, компилируется, когда я создаю его исполняемый файл. Я также проверил FAQ по перенасыщению, но решение теперь перенаправляет на мертвую ссылку Итак, вот мой контент Makefile, кто-нибудь видит, где я ошибаюсь?

TARGET   = lib_opengl.so
CC       = g++

SRC      = GL_Handler.cpp       \
           GL_Utils.cpp

DEVIL_CFLAGS    := $(shell pkg-config --cflags IL)
DEVIL_LIBS      := $(shell pkg-config --libs IL)

LIBS    += -lGL -lGLU -lglut $(DEVIL_CFLAGS) $(DEVIL_LIBS)

CFLAGS   = -W -Werror -Wall -ansi -pedantic -fPIC -shared  -L/usr/X11R6/lib/ $(LIBS)

SRCDIR   = src
OBJDIR   = obj

SOURCES  := $(addprefix src/, $(SRC))

OBJECTS  := $(SOURCES:$(SRCDIR)/%.cpp=$(OBJDIR)/%.o)

rm       = rm -rf
mkdir    = mkdir -p

$(TARGET): $(OBJECTS)
        @$(CC) $(CFLAGS) -o $@ $(OBJECTS)
        @echo $(TARGET)" compiled !"

$(OBJECTS): $(OBJDIR)/%.o : $(SRCDIR)/%.cpp
        @$(mkdir) $(OBJDIR)
        @$(CC) $(CFLAGS) -c $< -o $@

all     : $(TARGET)

clean   :
        @$(rm) $(OBJDIR)
        @echo "Binary files deleted"

fclean  : clean
        @$(rm) $(TARGET) $(LINK)
        @echo "Binary and executable files are deleted"

re      : fclean all

.PHONY: all clean fclean re

И вот результат, когда я пытаюсь связать его с моим загрузчиком общих библиотек.

./so_loader ./lib/lib_opengl.so
./so_loader: symbol lookup error: ./lib/lib_opengl.so: undefined symbol: glutInit

Я надеюсь, что моя проблема понятна и спасибо за чтение.


person Community    schedule 31.03.2017    source источник


Ответы (1)


Для начала используйте переменную LDFLAGS для компоновки вместо CFLAGS, предназначенной для компиляции. Что-то вроде этого:

LDFLAGS   = -L/usr/X11R6/lib
...
$(TARGET): LDFLAGS += -shared -Wl,--no-undefined
$(TARGET): $(OBJECTS)
        @$(CC) $(LDFLAGS) -o $@ $(OBJECTS) ${LIBS}
person Zsigmond Lőrinczy    schedule 01.04.2017
comment
Точно, это было непонятно. Теперь все работает отлично спасибо! - person ; 01.04.2017