Linux 下libusb编译与生成动态链接库

时间:2022-02-02 15:49:55

一、前言

        上一篇文章提到了怎样使用Ubuntu 安装libusb,忘了如何将如何编译。Linux 下libusb编译与生成动态链接库


二、libusb使用GCC 编译

正常来讲,使用  gccc xxx.c -o xxx -I/usr/include -lusb-1.0   就可以了,如下图:

Linux 下libusb编译与生成动态链接库

但是,当使用Ubuntu 12.04 使用这条命令编译,则会报错,如下图:

Linux 下libusb编译与生成动态链接库

提示,未找到这个`clock_gettime' 这个函数。Linux 下libusb编译与生成动态链接库

经测试,分别使用 Ubuntu 12.04   Ubuntu 14.04   Ubuntu 16.04   Ubuntu 17.10

只有在 Ubuntu 12.04  才会报错,也许这个太老了。

解决办法就是在命令后面,加上  -lrt  连接上实时库(real time)

如下图,在Ubuntu 12.04 上编译通过

Linux 下libusb编译与生成动态链接库

当连接多个文件是,建议最好使用Makefile,因为太久没有用了,当同时编译多个.c 文件,竟然忘了需要在命令上加上其他.c 文件,结果纠结几个小时才发现。Linux 下libusb编译与生成动态链接库在Windows 上用集成开发环境用多了。

如下图,同时连接多个文件,每次敲这个命令非常麻烦。

Linux 下libusb编译与生成动态链接库

直接使用make, 方便又省事。

Linux 下libusb编译与生成动态链接库

我的Makefile

LD		:= $(CROSS_COMPILE)ld
CC		:= $(CROSS_COMPILE)gcc
CPP		:= $(CROSS_COMPILE)g++
AR		:= $(CROSS_COMPILE)ar
STRIP	:= $(CROSS_COMPILE)strip

CFLAGS += -fPIC

SOURCES = $(wildcard *.c)
DEP = $(wildcard *.h)
OBJS = $(patsubst %.c, %.o,$(SOURCES))

ICMLIB_O = BulkTransfer.o ControlTranfser.o ErrorCode.o M235API.o UsbHid.o
ICMLIB_C = BulkTransfer.c ControlTranfser.c ErrorCode.c M235API.c UsbHid.c

TARGET_SO = libm235.so
TARGET_TEST = m235module 

$(TARGET_TEST): 
	$(CC) $(CFLAGS) *.c -o $(TARGET_TEST) -I/usr/include/ -lusb-1.0 -lrt

$(TARGET_SO): $(ICMLIB_O)
	$(CC) $(CFLAGS) -shared -o $@ $(ICMLIB_O) $(LIB) 
	if [ ! -z "$(STRIP)" ]; then $(STRIP) --strip-all $@; fi;

$(ICMLIB_O): %.o: %.c $(DEP)
	$(CC) $(CFLAGS) -c $< -o $@ -I/usr/include/ -lusb-1.0 -lrt

clean:
	rm -f $(TARGET_SO) *~ *.swp $(OBJS) a.out *.gc* $(TARGET_TEST)

三、动态库的编译

需要将libub的函数封装到用户自己的动态库中,有几个注意的问题,动态库的编译命令和正常的一样。

但是,当别人使用你的调用你的动态库时,千万记得需要将 /usb/local/lib 的libusb-1.0.so  提供给别人,

不然当用户调你的动态库编译会报如下错误,

Linux 下libusb编译与生成动态链接库

所以,需要提供那个库,如下图:

Linux 下libusb编译与生成动态链接库

记录,结束。