1、工程结构
这里以一个网盘文件传输项目为例
2、 编译生成动态库
这里写了一个Makefile专用于生成动态库
CC = aarch64-linux-gnu-gcc #64位arm平台交叉编译器
CFLAGS = -fPIC -Wall #生成与位置无关代码
SRC = $(wildcard *.c) #查找所有.c文件
OBJ = $(patsubst %.c, %.o, $(SRC)) #将所有.c文件替换为.o
APP = go_go #可执行文件名
LIBNAME=libmylibrary.so #动态库全称
LIBNAME_LINK = mylibrary #动态库名
all: $(LIBNAME) #生成动态库。往下寻找依赖
$(LIBNAME): $(OBJ)
$(CC) -shared -fPIC -o $@ $^ #$@指向规则,$^指向所有依赖
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@ #$<每次指向第一个依赖
clean:
rm -f $(OBJ) $(LIBNAME) $(APP) #清除所产生的全部文件
#install: $(LIBNAME) #若在本地测试,即将生成的库放入/lib下便于动态加载器查找
#sudo cp $(LIBNAME) /lib
install:
sudo scp $(LIBNAME) $(APP) root@192.168.105.250:/drive_code #通过网络发送至开发板
#install-headers:
#cp *.h /usr/local/include #放入此路径也是为了能找到头文件
#install:
#sudo cp srv_main /usr/local/bin #将可执行文件放入已设置的环境变量地址下,可全局运行
run:
$(CC) main.c -o $(APP) -L. -l$(LIBNAME_LINK) -lpthread #编译工程中主函数并链接自己的库
.PHONY: clean #防止clean重名文件导致make clean不生效
3、实际操作演示
root@SOM-RK3399v2:/drive_code# sudo mv libmylibrary.so /lib
此处为开发板linux终端下,将复制过来的动态库文件放入开发板的/lib目录下,若直接运行结果如下。
root@SOM-RK3399v2:/drive_code# ./go_go
./go_go: error while loading shared libraries: libmylibrary.so: cannot open shared object file: No such file or directory
至此,顺利打包到rk3399开发板并成功运行。
root@SOM-RK3399v2:/drive_code# ./go_go
**********欢迎使用**********
^C
root@SOM-RK3399v2:/drive_code#