动态、静态链接库是常见的第三方依赖库,针对这类依赖库,常用的归一化方法是编译脚本与文件路径相结合的方式,通过在编译脚本中指定链接时的相对或绝对路径,并在该路径下放置已编译的库文件完成依赖库归一。
针对依赖的第三方库,先基于源码完成编译,生成相应的库文件;创建不同架构的库文件存放路径(如xx/lib/aarch64或xx/lib/x86_64),再将编译好的库文件放置于对应路径下;编译脚本中修改编译链接时路径,使其自适应选择对应架构下的库文件。
示例:
以下示例代码通过构造一个libcrc32.so动态库,进行依赖库归一,使其在鲲鹏及x86架构平台均能编译运行。
将以下基础功能代码分别在鲲鹏及x86平台编译生成对应的libcrc32.so,分别置于创建的xx/lib/x86_64和xx/lib/aarch64目录下。
crc32.cpp文件:
#include "crc32.h" #ifdef __x86_64__ uint32_t crc32_u8(uint32_t crc, uint8_t value) { __asm__("crc32b %1, %0" : "+r"(crc) : "rm"(value)); return crc; } #endif #ifdef __aarch64__ uint32_t crc32_u8(uint32_t crc, uint8_t value) { __asm__("crc32cb %w[c], %w[c], %w[v]":[c]"+r"(crc):[v]"r"(value)); return crc; } #endif
crc32.h文件:
#ifndef CRC32__HHHH_HH #define CRC32__HHHH_HH #include <stdint.h> uint32_t crc32_u8(uint32_t crc, uint8_t v); #endif
使用以下命令编译相应平台动态库:
g++ crc32.cpp -I ./include -fPIC -shared -o libcrc32.so
鲲鹏处理器下需增加-march=armv8-a+crc编译选项,./include为实际crc32.h文件路径。
修改编译脚本,编译链接时根据架构不同自动选择对应路径进行库的链接。
#!/bin/bash ARCH_TYPE=`uname -m` if [ "$ARCH_TYPE" = "x86_64" ];then g++ main.cpp -I ./include/ -L ./lib/x86_64/ -lcrc32 -o main fi if [ "$ARCH_TYPE" = "aarch64" ];then g++ main.cpp -I ./include/ -L ./lib/aarch64/ -lcrc32 -o main fi
示例工程文件组织结构如下:
crc32Project ├── build.sh ├── include │ └── crc32.h ├── lib │ ├── aarch64 │ │ └── libcrc32.so │ └──x86_64 │ └── libcrc32.so └── main.cpp