带有 freeglut 的共享库 - 未定义的符号
Shared library with freeglut - undefined symbol
我在 link 使用 C++ 项目 OpenGL/freeglut 共享库 (.so) 时遇到了一些问题。我确定问题出在我的 Makefile 中,因为我用来加载的代码(使用 dlopen/dlsym/dlclose 函数)可以与其他共享库一起正常工作。
我认为它来自 headers 包含,但是当我创建它的可执行文件时,我尝试使用的 OpenGL 项目编译。我还检查了过剩的常见问题解答,但解决方案现在重定向到一个死的 link 所以有我的 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
当我尝试使用我的共享库加载程序 link 时,结果出现了。
./so_loader ./lib/lib_opengl.so
./so_loader: symbol lookup error: ./lib/lib_opengl.so: undefined symbol: glutInit
希望我的问题可以理解,感谢阅读。
首先,使用变量 LDFLAGS 进行链接,而不是用于编译的 CFLAGS。像这样:
LDFLAGS = -L/usr/X11R6/lib
...
$(TARGET): LDFLAGS += -shared -Wl,--no-undefined
$(TARGET): $(OBJECTS)
@$(CC) $(LDFLAGS) -o $@ $(OBJECTS) ${LIBS}
我在 link 使用 C++ 项目 OpenGL/freeglut 共享库 (.so) 时遇到了一些问题。我确定问题出在我的 Makefile 中,因为我用来加载的代码(使用 dlopen/dlsym/dlclose 函数)可以与其他共享库一起正常工作。 我认为它来自 headers 包含,但是当我创建它的可执行文件时,我尝试使用的 OpenGL 项目编译。我还检查了过剩的常见问题解答,但解决方案现在重定向到一个死的 link 所以有我的 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
当我尝试使用我的共享库加载程序 link 时,结果出现了。
./so_loader ./lib/lib_opengl.so
./so_loader: symbol lookup error: ./lib/lib_opengl.so: undefined symbol: glutInit
希望我的问题可以理解,感谢阅读。
首先,使用变量 LDFLAGS 进行链接,而不是用于编译的 CFLAGS。像这样:
LDFLAGS = -L/usr/X11R6/lib
...
$(TARGET): LDFLAGS += -shared -Wl,--no-undefined
$(TARGET): $(OBJECTS)
@$(CC) $(LDFLAGS) -o $@ $(OBJECTS) ${LIBS}