一、前言
上一篇文章提到了怎样使用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 提供给别人,
不然当用户调你的动态库编译会报如下错误,
所以,需要提供那个库,如下图:
记录,结束。