---
title: 依赖库归一
description: "动态、静态链接库是常见的第三方依赖库，针对这类依赖库，常用的归一化方法是编译脚本与文件路径相结合的方式，通过在编译脚本中指定链接时的相对或绝对路径，并在该路径下放置已编译的库文件完成依赖库归一。"
url: https://www.hikunpeng.com/document/detail/zh/kunpenggrf/codeprtr/kunpengtaishanporting_12_0090.html
sourcePath: /source/zh/kunpenggrf/codeprtr/kunpengtaishanporting_12_0090.html
indexId: 3096a7024966d4f57acbe9b075c8be9e675cb622889bfdc6d3c9b6186155b60e65
---
# 依赖库归一

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

#### 处理步骤

针对依赖的第三方库，先基于源码完成编译，生成相应的库文件；创建不同架构的库文件存放路径（如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
```
