linux下或者android下编程经常遇到dlopen 、dlclose等未定义函数,其实 只要我们链接上dl库就可以解决这个问题,在makefile 加上-ldl选项,便可以解决这个问题。
很多文章都讲,正常的话-ldl就可以解决问题。
但是我遇到的makefile是这样的:
DESTDIR = /usr/local
CC = gcc
CFLAGS += -O2 -DLINUX -D_GNU_SOURCE -Wall
LFLAGS += -lpthread -ldl
APP_BINARY = mjpg_streamer
PLUGINS = input_uvc.so
PLUGINS += output_file.so
PLUGINS += output_http.so
PLUGINS += input_testpicture.so
PLUGINS += output_autofocus.so
PLUGINS += input_gspcav1.so
PLUGINS += input_file.so
PLUGINS += input_control.so
OBJECTS=mjpg_streamer.o utils.o
all: application plugins
application: $(APP_BINARY)
plugins: $(PLUGINS)
$(APP_BINARY): mjpg_streamer.c mjpg_streamer.h mjpg_streamer.o utils.c utils.h utils.o
$(CC) $(CFLAGS) $(LFLAGS) $(OBJECTS) -o $(APP_BINARY)
chmod 755 $(APP_BINARY)
……
实际上它已经带有-ldl了,在LFLAGS里,但还是存在以上错误。
gcc -O2 -DLINUX -D_GNU_SOURCE -Wall -lpthread -ldl mjpg_streamer.o utils.o -o mjpg_streamer
mjpg_streamer.o: In function signal_handler': mjpg_streamer.c:(.text+0x122): undefined reference to
dlclose’
mjpg_streamer.c:(.text+0x144): undefined reference to `dlclose’
那就是GCC语法错误,我把它改成:
$(CC) $(OBJECTS) -o $(APP_BINARY) $(CFLAGS) $(LFLAGS)
调换位置,编译通过。
GCC语法, 其实我是小白,有望和大家探讨