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

文章介绍了如何在项目中正确处理编译时依赖,如main.c和usb_hid.c之间的关系,以及如何解决在编译动态链接库libpufmac.so时遇到的undefinedsymbol错误。作者分享了makefile配置和正确的编译命令,以确保链接库的顺利生成。
摘要由CSDN通过智能技术生成

一、问题介绍

由于项目需求,需要将一个“编译时引用了另一个动态链接库”的文件(名为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的头文件的位置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值