Linux中生成so库的文件引用另一个so库问题的解决

一、问题介绍

由于项目需求,需要将一个“编译时引用了另一个动态链接库”的文件(名为main.c),再编译成一个动态链接库。

简要说明一下,即原本的项目代码里,包含main.c,usb_hid.c和usb_hid.h三个文件,正常编译可执行文件main的依赖为

main.o依赖libusb库,usb_hid.c依赖libusb库,而可执行文件main依赖前两步编译生成的main.o和usb_hid.o

对应的makefile如下

CC      = gcc
CFLAGS	= -I . -I /usr/local/include/libusb-1.0 -std=c99
TARGET	= main

all: $(TARGET)

main: ./main.o ./usb_hid.o
	$(CC) $^ -L/usr/local/lib -lusb-1.0 -o main
	rm -rf ./*.o

./main.o: ./main.c
	$(CC) $(CFLAGS) -c $< -o $@

./usb_hid.o: ./usb_hid.c
	$(CC) $(CFLAGS) -c $< -o $@

clean:
	rm -rf ./*.o
	rm -rf ./main

# ----------------------------------------------------------------------------

.PHONY: $(PHONY) clean

二、问题解决

之前没有搞清楚依赖关系,没有引入usb_hid相关的函数,因此使用ldd -r libpufmac.so命令后会报如下错误:

OSError: ./libpufmac.so: undefined symbol: usb_index
OSError: ./libpufmac.so: undefined symbol: xxxxx
......

结合之前编译动态链接库的经验,正确的编译命令如下,使用该命令编译后,可生成对应的libpufmac.so,不会再出现上面的错误

gcc -shared -fPIC main.c usb_hid.c -o libpufmac.so -L/usr/local/lib -lusb-1.0 -I /usr/local/include/libusb-1.0 -std=c99

通过 -L引用对应的动态链接库,再通过 -I指定include的头文件的位置

猜你喜欢

转载自blog.csdn.net/weixin_46841376/article/details/133486931