一、前言 上一篇文章提到了怎样使用Ubuntu 安装libusb,忘了如何将如何编译。

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

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

提示,未找到这个`clock_gettime' 这个函数。

经测试,分别使用 Ubuntu 12.04 Ubuntu 14.04 Ubuntu 16.04 Ubuntu 17.10只有在 Ubuntu 12.04 才会报错,也许这个太老了。解决办法就是在命令后面,加上
-lrt 连接上实时库(real time)如下图,在Ubuntu 12.04 上编译通过

当连接多个文件是,建议最好使用Makefile,因为太久没有用了,当同时编译多个.c 文件,竟然忘了需要在命令上加上其他.c 文件,结果纠结几个小时才发现。

在Windows 上用集成开发环境用多了。如下图,同时连接多个文件,每次敲这个命令非常麻烦。

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

我的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 提供给别人,不然当用户调你的动态库编译会报如下错误,
所以,需要提供那个库,如下图:

记录,结束。