鲲鹏社区首页
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

依赖库归一

动态、静态链接库是常见的第三方依赖库,针对这类依赖库,常用的归一化方法是编译脚本与文件路径相结合的方式,通过在编译脚本中指定链接时的相对或绝对路径,并在该路径下放置已编译的库文件完成依赖库归一。

处理步骤

针对依赖的第三方库,先基于源码完成编译,生成相应的库文件;创建不同架构的库文件存放路径(如xx/lib/aarch64或xx/lib/x86_64),再将编译好的库文件放置于对应路径下;编译脚本中修改编译链接时路径,使其自适应选择对应架构下的库文件。

示例:

以下示例代码通过构造一个libcrc32.so动态库,进行依赖库归一,使其在鲲鹏及x86架构平台均能编译运行。

  • 编译生成鲲鹏及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