带有freeglut的共享库 - 未定义的符号

时间:2017-03-31 13:44:34

标签: opengl makefile g++ shared-libraries freeglut

在将OpenGL / freeglut共享库(.so)与C ++项目链接时,我实际上遇到了一些问题。我确定问题出在我的Makefile中,因为我用来加载的代码(使用dlopen / dlsym / dlclose函数)可以与其他共享库一起使用。 我认为它来自头文件包含但是当我创建它的可执行文件时我正在尝试编译的OpenGL项目。我也检查了过多的常见问题,但解决方案现在重定向到死链接所以有我的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

我希望我的问题是可以理解的,并感谢阅读。

1 个答案:

答案 0 :(得分:0)

首先,使用变量LDFLAGS代替用于编译的CFLAGS进行链接。像这样:

LDFLAGS   = -L/usr/X11R6/lib
...
$(TARGET): LDFLAGS += -shared -Wl,--no-undefined
$(TARGET): $(OBJECTS)
        @$(CC) $(LDFLAGS) -o $@ $(OBJECTS) ${LIBS}