---
title: 部署开发环境
description: "FlexDA编程框架的操作系统如表 操作系统要求所示。"
url: https://www.hikunpeng.com/document/detail/zh/flexda/devguide/dpak_dev0020.html
sourcePath: /source/zh/flexda/devguide/dpak_dev0020.html
indexId: 77f8e953026c335c22f5614182494ca041cdd6a409729b8c0c34eb66ed139f1a44
---
# 部署开发环境

#### 操作系统要求

FlexDA编程框架的操作系统如表 操作系统要求所示。


**表1 操作系统要求**

| 特性 | 操作系统 | 架构 | 推荐版本 |
| --- | --- | --- | --- |
| OVS | openEuler | AArch64 | 22.03 LTS SP3 |
| OVS | Ubuntu | AArch64 | 22.04 LTS |
| OVS | CentOS | AArch64 | CentOS 9\-Stream |
| OVS控制面 | openEuler | AArch64 | 22.03 LTS SP3 |


#### 编译软件要求

FlexDA编程框架的编译环境软件要求如表2所示。


**表2 编译环境软件要求**

| 名称 | 相关特性 | 版本要求 |
| --- | --- | --- |
| GCC | OVS | 推荐版本12.3.0。 |
| LLVM | OVS | 12.0.1~15.0.3，推荐版本12.0.1。 |
| Clang | OVS | 12.0.1~15.0.3，推荐版本12.0.1。 |
| 交叉编译工具链 | OVS | 推荐版本14.2.Rel1。 编程框架提供的编程库使用LTO优化，交叉编译工具链版本需要与编程库使用的工具链保持一致，防止编译失败。 安装方式可参见安装交叉编译工具链。 |
| CMake | OVS | 3.22.0~3.25.0，推荐版本3.22.0。 |
| Make | OVS | 4.3.0~4.4.0，推荐版本4.3.0。 |
| OpenSSL | OVS | 1.1.1~3.0.12，推荐版本1.1.1。 |
| Protobuf | OVS | 推荐版本25.1。详情请参见Protobuf安装。 |
| Python | OVS | 3.11.4~3.11.13，推荐版本3.11.4。 OVS场景需要安装Python，参见安装Python。 |
| DPDK | OVS控制面 | 23.11（与运行环境保持一致）。 OVS控制面编译需要安装正确版本的 DPDK ，详情可参见安装DPDK。 |


#### Protobuf安装

当前发布版本需要用户手动安装Protobuf，推荐以源码编译的形式安装，安装步骤如下所示。

1. 下载Protobuf(https://github.com/protocolbuffers/protobuf/releases/download/v25.1/protobuf-25.1.tar.gz)和编译依赖的Abseil源码包(https://github.com/abseil/abseil-cpp/releases/download/20230802.2/abseil-cpp-20230802.2.tar.gz)，两个源码包放在同一目录。
2. 解压源码包。

```
tar -zxvf abseil-cpp-20230802.2.tar.gz
tar -xzf protobuf-25.1.tar.gz
mv abseil-cpp-20230802.2/* protobuf-25.1/third_party/abseil-cpp/
cd protobuf-25.1
```


3. 生成编译配置，用户可通过--prefix指定安装路径。推荐安装在系统目录下。

```
mkdir build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/usr -Dprotobuf_BUILD_TESTS=OFF -Dprotobuf_BUILD_SHARED_LIBS=ON -DCMAKE_CXX_STANDARD=17
```


4. 编译protoc及Protobuf runtime。

```
make -j
```


  可使用多线程编译提高编译速度，其中{n}根据设备性能进行选择。

```
make -j
{n}
```


5. 安装protoc及Protobuf runtime，并刷新动态库配置缓存。

```
# 非root账号需要使用sudo安装
sudo make install
sudo ldconfig
```


  - 若用户指定安装目录为/usr，则protoc安装在“/usr/bin”目录下，libprotobuf.a & *.so安装在“/usr/lib”目录下。
  - 若用户指定安装路径非系统目录，则需要将bin和lib路径导入到环境变量，示例如下。

```
# 若指定--prefix=/path/to/protobuf
export PATH=/path/to/protobuf/bin:$PATH
export LD_LIBRARY_PATH=/path/to/protobuf/lib:$LD_LIBRARY_PATH
```


6. 执行以下命令，查看版本。

```
protoc --version
```


  若打印版本信息，表示安装成功。

```
# libprotoc 25.1
```


7. 创建软链接。
使用软链接替换libstdc++.so后，若执行yum、rpm等命令，可能会重置该软链接，导致编译固件过程中报错。当出现“version 'GLIBCXX_3.4.29' not found”报错时，重新执行步骤7.b。


  a. 观察打印信息，发现关键词“version 'GLIBCXX_3.4.29' not found”。

```
protoc: /usr/bin/../lib64/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /usr/bin/../lib64/libprotoc.so.25.1.0)
protoc: /usr/bin/../lib64/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /usr/bin/../lib64/libprotobuf.so.25.1.0)
protoc: /usr/bin/../lib64/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /usr/bin/../lib64/libabsl_log_internal_message.so.2308.0.0)
protoc: /usr/bin/../lib64/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /usr/bin/../lib64/libabsl_log_internal_log_sink_set.so.2308.0.0)
protoc: /usr/bin/../lib64/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /usr/bin/../lib64/libabsl_flags_marshalling.so.2308.0.0)
protoc: /usr/bin/../lib64/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /usr/bin/../lib64/libabsl_flags_reflection.so.2308.0.0)
protoc: /usr/bin/../lib64/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /usr/bin/../lib64/libabsl_status.so.2308.0.0)
protoc: /usr/bin/../lib64/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /usr/bin/../lib64/libabsl_cord.so.2308.0.0)
protoc: /usr/bin/../lib64/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /usr/bin/../lib64/libabsl_cordz_handle.so.2308.0.0)
protoc: /usr/bin/../lib64/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /usr/bin/../lib64/libabsl_crc_cord_state.so.2308.0.0)
protoc: /usr/bin/../lib64/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /usr/bin/../lib64/libabsl_str_format_internal.so.2308.0.0)
protoc: /usr/bin/../lib64/libstdc++.so.6: version `GLIBCXX_3.4.30' not found (required by /usr/bin/../lib64/libabsl_synchronization.so.2308.0.0)
protoc: /usr/bin/../lib64/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /usr/bin/../lib64/libabsl_strings.so.2308.0.0)
protoc: /usr/bin/../lib64/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /usr/bin/../lib64/libabsl_time_zone.so.2308.0.0)
```


  b. 将/usr/lib64/libstdc++.so.6软链接到libstdc++.so.6.0.29及以上。
    例如环境已经按照要求安装了GCC 12.3.0，可以执行以下命令进行软链接：

```
sudo ln -sf /usr/local/gcc-12/lib64/libstdc++.so.6.0.30 /usr/lib64/libstdc++.so.6
```


#### 安装交叉编译工具链

1. 进入arm-gnu-toolchain-downloads(https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads)，根据操作系统的架构，选择相应的软件包版本。
  - 对于x86环境，建议安装arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf.tar.xz
  - 对于arm环境，建议安装arm-gnu-toolchain-14.2.rel1-aarch64-aarch64-none-elf.tar.xz。
不同操作系统的安装步骤一致，本节以x86环境的软件包为例进行说明。在x86环境下载工具链包并解压至本地环境。

```
tar -xvf arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf.tar.xz
```

2. 执行以下命令，将解压后目录中的bin文件夹内的文件软链接至/usr/bin目录下。

```
ln -sf
{本地下载的包路径
}
/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/* /usr/bin/
```


  例如：

```
ln -sf /root/arm-gnu-toolchain/bin/* /usr/bin/
```


3. 输入以下命令，查看是否软链接成功。

```
ll /usr/bin |grep aarch64-none-elf
```


  打印信息如下所示，即链接成功。

```
lrwxrwxrwx  1 root root          88 May 29 10:48 aarch64-none-elf-addr2line ->
{本地下载的包路径}
/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-addr2line
lrwxrwxrwx  1 root root          81 May 29 10:48 aarch64-none-elf-ar ->
{本地下载的包路径}
/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-ar
lrwxrwxrwx  1 root root          81 May 29 10:48 aarch64-none-elf-as ->
{本地下载的包路径}
/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-as
lrwxrwxrwx  1 root root          82 May 29 10:48 aarch64-none-elf-c++ ->
{本地下载的包路径}
/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-c++
lrwxrwxrwx  1 root root          86 May 29 10:48 aarch64-none-elf-c++filt ->
{本地下载的包路径}
/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-c++filt
lrwxrwxrwx  1 root root          82 May 29 10:48 aarch64-none-elf-cpp ->
{本地下载的包路径}
/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-cpp
lrwxrwxrwx  1 root root          86 May 29 10:48 aarch64-none-elf-elfedit ->
{本地下载的包路径}
/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-elfedit
lrwxrwxrwx  1 root root          82 May 29 10:48 aarch64-none-elf-g++ ->
{本地下载的包路径}
/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-g++
lrwxrwxrwx  1 root root          82 May 29 10:48 aarch64-none-elf-gcc ->
{本地下载的包路径}
/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-gcc
lrwxrwxrwx  1 root root          89 May 29 10:48 aarch64-none-elf-gcc-13.2.1 ->
{本地下载的包路径}
/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-gcc-13.2.1
lrwxrwxrwx  1 root root          85 May 29 10:48 aarch64-none-elf-gcc-ar ->
{本地下载的包路径}
/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-gcc-ar
lrwxrwxrwx  1 root root          85 May 29 10:48 aarch64-none-elf-gcc-nm ->
{本地下载的包路径}
/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-gcc-nm
lrwxrwxrwx  1 root root          89 May 29 10:48 aarch64-none-elf-gcc-ranlib ->
{本地下载的包路径}
/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-gcc-ranlib
lrwxrwxrwx  1 root root          83 May 29 10:48 aarch64-none-elf-gcov ->
{本地下载的包路径}
/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-gcov
lrwxrwxrwx  1 root root          88 May 29 10:48 aarch64-none-elf-gcov-dump ->
{本地下载的包路径}
/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-gcov-dump
lrwxrwxrwx  1 root root          88 May 29 10:48 aarch64-none-elf-gcov-tool ->
{本地下载的包路径}
/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-gcov-tool
lrwxrwxrwx  1 root root          82 May 29 10:48 aarch64-none-elf-gdb ->
{本地下载的包路径}
/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-gdb
lrwxrwxrwx  1 root root          92 May 29 10:48 aarch64-none-elf-gdb-add-index ->
{本地下载的包路径}
/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-gdb-add-index
lrwxrwxrwx  1 root root          87 May 29 10:48 aarch64-none-elf-gfortran ->
{本地下载的包路径}
/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-gfortran
lrwxrwxrwx  1 root root          84 May 29 10:48 aarch64-none-elf-gprof ->
{本地下载的包路径}
/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-gprof
lrwxrwxrwx  1 root root          81 May 29 10:48 aarch64-none-elf-ld ->
{本地下载的包路径}
/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-ld
lrwxrwxrwx  1 root root          85 May 29 10:48 aarch64-none-elf-ld.bfd ->
{本地下载的包路径}
/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-ld.bfd
lrwxrwxrwx  1 root root          87 May 29 10:48 aarch64-none-elf-lto-dump ->
{本地下载的包路径}
/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-lto-dump
lrwxrwxrwx  1 root root          81 May 29 10:48 aarch64-none-elf-nm ->
{本地下载的包路径}
/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-nm
lrwxrwxrwx  1 root root          86 May 29 10:48 aarch64-none-elf-objcopy ->
{本地下载的包路径}
/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-objcopy
lrwxrwxrwx  1 root root          86 May 29 10:48 aarch64-none-elf-objdump ->
{本地下载的包路径}
/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-objdump
lrwxrwxrwx  1 root root          85 May 29 10:48 aarch64-none-elf-ranlib ->
{本地下载的包路径}
/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-ranlib
lrwxrwxrwx  1 root root          86 May 29 10:48 aarch64-none-elf-readelf ->
{本地下载的包路径}
/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-readelf
lrwxrwxrwx  1 root root          83 May 29 10:48 aarch64-none-elf-size ->
{本地下载的包路径}
/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-size
lrwxrwxrwx  1 root root          86 May 29 10:48 aarch64-none-elf-strings ->
{本地下载的包路径}
/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-strings
lrwxrwxrwx  1 root root          84 May 29 10:48 aarch64-none-elf-strip ->
{本地下载的包路径}
/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin/aarch64-none-elf-strip
```


4. 执行如下命令，查询交叉编译工具链版本。

```
aarch64-none-elf-gcc -v
```


  打印信息如下所示，表示安装成功。

```
Using built-in specs.
COLLECT_GCC=aarch64-none-elf-gcc
COLLECT_LTO_WRAPPER=/home/CIDA/flexdacc/packages/arm-gnu-toolchain-14.2.rel1-aarch64-aarch64-none-elf/bin/../libexec/gcc/aarch64-none-elf/14.2.1/lto-wrapper
Target: aarch64-none-elf
Configured with: /data/jenkins/workspace/GNU-toolchain/arm-14/src/gcc/configure --target=aarch64-none-elf --prefix=/data/jenkins/workspace/GNU-toolchain/arm-14/build-aarch64-none-elf/install --with-gmp=/data/jenkins/workspace/GNU-toolchain/arm-14/build-aarch64-none-elf/host-tools --with-mpfr=/data/jenkins/workspace/GNU-toolchain/arm-14/build-aarch64-none-elf/host-tools --with-mpc=/data/jenkins/workspace/GNU-toolchain/arm-14/build-aarch64-none-elf/host-tools --with-isl=/data/jenkins/workspace/GNU-toolchain/arm-14/build-aarch64-none-elf/host-tools --disable-shared --disable-nls --disable-threads --disable-tls --enable-checking=release --enable-languages=c,c++,fortran --with-newlib --with-gnu-as --with-headers=yes --with-gnu-ld --with-native-system-header-dir=/include --with-sysroot=/data/jenkins/workspace/GNU-toolchain/arm-14/build-aarch64-none-elf/install/aarch64-none-elf --with-bugurl=https://bugs.linaro.org/ --with-pkgversion='Arm GNU Toolchain 14.2.Rel1 (Build arm-14.52)'
Thread model: single
Supported LTO compression algorithms: zlib
gcc version 14.2.1 20241119 (Arm GNU Toolchain 14.2.Rel1 (Build arm-14.52))
```


#### 安装Python

通过源码安装python前，需要安装依赖软件GCC、CMake、Make。


本节以openEuler操作系统为例展示如何通过源码安装Python。

1. 进入Python-downloads-source(https://www.python.org/downloads/source/)，下载Python 3.11.x版本的XZ软件包，并解压至本地环境。
  本节以Python 3.11.4作为安装版本，“/opt/buildtools”
  为安装目录示例。

```
cd /opt/buildtools
tar -xf Python-3.11.4.tar.xz
```


2. 设置编译参数，创建Python工作目录“/opt/buildtools/python-3.11”。

```
tmp_cpus=$(grep -w processor /proc/cpuinfo|wc -l)
install_dir=/opt/buildtools/python-3.11
mkdir -p ${install_dir}
```


3. 执行Python编译。

```
cd Python-3.11.4
./configure CFLAGS="-D_FORTIFY_SOURCE=2 -O2 -fstack-protector-strong" CPPFLAGS="-D_FORTIFY_SOURCE=2 -O2 -fstack-protector-strong" LDFLAGS="-Wl,-z,relro,-z,now -s" --prefix=${install_dir} -enable-shared
make -j ${tmp_cpus}
make install
sudo cp libpython3.11.so.1.0 libpython3.11.so /usr/lib64
```


  若操作系统非openEuler，需将libpython3.11.so.1.0和libpython3.11.so拷贝到对应的系统库目录中（例如，arm架构下，Ubuntu中为/lib/aarch64-linux-gnu）。

4. 修改“/usr/local/bin”下的Python软链接，如需回退应备份原Python文件。

```
[ -f /usr/local/bin/python3 ] && rm -f /usr/local/bin/python3
[ -e ${install_dir}/bin/python3.11 ] && ln -sf ${install_dir}/bin/python3.11 /usr/local/bin/python3
[ -f /usr/local/bin/python ] && rm -f /usr/local/bin/python
[ -e ${install_dir}/bin/python3.11 ] && ln -sf ${install_dir}/bin/python3.11 /usr/local/bin/python
[ -f /usr/local/bin/pip3 ] && rm -f /usr/local/bin/pip3
[ -e ${install_dir}/bin/pip3.11 ] && ln -sf ${install_dir}/bin/pip3.11 /usr/local/bin/pip3
```


5. 执行以下命令，查询Python版本。

```
/usr/local/bin/python3 -V
```


  打印信息如下所示，表示安装成功。

```
Python 3.11.4
```


- 完成上述安装后，编译固件时报错，形如“xxx /usr/bin/python3 xxx”。重新打开终端后，继续执行固件编译命令。
- 上述步骤仅修改了/usr/local/bin下的Python软链接，未对/usr/bin下的Python软链接进行修改，避免对操作系统命令如yum造成影响，如后续正常操作过程中遇到Python报错，可尝试恢复/usr/local/bin下Python软链接进行修复。


#### 安装DPDK

通过源码安装DPDK前，需要安装依赖软件tar、meson、automake、libtool、openssl-devel、python3-pyelftools以及numactl-devel。


1. 进入Index of /rel/(https://fast.dpdk.org/rel/)，下载dpdk-23.11.tar.gz软件包，并解压至本地环境。

```
tar -zxvf dpdk-23.11.tar.gz
cd dpdk-23.11/
```


2. 配置编译参数。

```
meson --prefix=/usr -Ddisable_drivers=net/cnxk -Dc_args='-O0 -fstack-protector-strong' -Dmax_ethports=960 -Dc_link_args='-Wl,-z,relro,-z,now,-z,noexecstack' -Dplatform=generic build
```


3. 编译安装。

```
ninja -C build && ninja install -C build
```


4. 执行以下命令，查询 DPDK 版本。

```
pkg-config --modversion libdpdk
```


  打印信息如下所示，表示安装成功。

```
23.11.0
```
