最近需要发布软件到arm平台,研究了一下可执行文件和共享库如何一起打包发布,开源的软件有Statifier 或者Ermine,看了下没怎么看明白,然后一直在网上查找资料,看到可以从可执行文件提取共享库列表,感觉这问题可能有眉目了,花了一个晚上加周末一天时间,中途遇到了一些困难,最终效果还算满意,拷贝运行时必要的共享库,减少了软件发布包大小,以下是具体步骤:
1、首先从可执行文件获取链接的共享库列表
LIB_LISTS := $(shell aarch64-linux-gnu-objdump -x app| grep NEEDED| awk '{print $$2}')
参考链接:https://cloud.tencent.com/developer/ask/201548
2、通过Makefile两个foreach拼接出所有可能的库路径+文件,注意这里用了穷举法有些库路径+文件是不存在的
TEMP_FILES := $(foreach dir, $(shell find ../lib -maxdepth 3 -type d), $(foreach file, $(shell echo $(LIB_LISTS)), $(dir)/$(file)))
3、通过在foreach第3个参数添加shell命令,判断库路径+文件是否存在(这步比较难,Makefile在循环里判断文件存在一直没有成功,不知何故),筛选出真实存在的库路径+文件
LIB_FILES := $(foreach file, $(shell echo $(TEMP_FILES)),$(shell if [ -f $(file) ]; then echo $(file); fi;))
4、再写一个循环,把这些运行库从交叉编译库目录拷贝到目标库文件夹
.PHONY:release
release:
@for file in $(LIB_FILES); do \
cp $$file ../output/lib; \
done
后面就剩下和可执行文件一起打包了
大功告成!