---
title: openGauss在异构条件下的编译指南-官方技术文章-鲲鹏社区
description: 本文主要介绍openGauss在异构条件下如何进行编译。
keywords: Gauss,在异构条件下,的编译指南,官方技术文章,鲲鹏社区,介质下载,注意事项,环境信息
url: https://www.hikunpeng.com/developer/techArticles/20230912-10?envFlag=1
section: (其他)
---

# openGauss在异构条件下的编译指南-官方技术文章-鲲鹏社区

URL: https://www.hikunpeng.com/developer/techArticles/20230912-10?envFlag=1
描述: 本文主要介绍openGauss在异构条件下如何进行编译。
关键词: Gauss,在异构条件下,的编译指南,官方技术文章,鲲鹏社区,介质下载,注意事项,环境信息

官方技术文章 [了解详情](https://www.hikunpeng.com/zh/developer/techArticles)

openGauss在异构条件下的编译指南

openGauss在异构条件下的编译指南

实战经验

发表于 2021/07/07

0

## 介质下载

opengauss-openGauss-server-v2.0.0.tar.gz(openGauss源码包)

下载地址：

https://gitcode.com/opengauss/openGauss-server/repository/archive/v2.0.0?ref=v2.0.0&sha=78689da92cdc811cad2458dc213d007e96864062&format=tar.gz&captcha_type=yunpian [了解详情](https://gitcode.com/opengauss/openGauss-server/repository/archive/v2.0.0?ref=v2.0.0&sha=78689da92cdc811cad2458dc213d007e96864062&format=tar.gz&captcha_type=yunpian)

opengauss-openGauss-third_party-2.0.0.zip(openGauss-server依赖的所有三方库的源码包)

下载地址：

https://gitcode.com/opengauss/openGauss-third_party/repository/archive/v2.0.0.zip?ref=v2.0.0&sha=3a38c6c134e5b2e39d0557d575ec04302a83584a&format=zip&captcha_type=yunpian [了解详情](https://gitcode.com/opengauss/openGauss-third_party/repository/archive/v2.0.0.zip?ref=v2.0.0&sha=3a38c6c134e5b2e39d0557d575ec04302a83584a&format=zip&captcha_type=yunpian)

openGauss-third_party_binarylibs.tar.gz(openGauss-server依赖的所有三方库的介质包)

下载地址：

https://opengauss.obs.cn-south-1.myhuaweicloud.com/2.0.0/openGauss-third_party_binarylibs.tar.gz [了解详情](https://opengauss.obs.cn-south-1.myhuaweicloud.com/2.0.0/openGauss-third_party_binarylibs.tar.gz)

说明：此文档参考以下官方编译文档链接编写

https://opengauss.org/zh/docs/2.0.0/docs/Compilationguide/%E7%89%88%E6%9C%AC%E7%BC%96%E8%AF%91.html [了解详情](https://opengauss.org/zh/docs/2.0.0/docs/Compilationguide/%E7%89%88%E6%9C%AC%E7%BC%96%E8%AF%91.html)

## 注意事项

当前生成的均是64位的可执行程序。

## 环境信息

基本硬件：

CPU(s):4

model name:Phytium,FT-1500A

磁盘信息：

/dev/mapper/klas-root:46G(容量)

内存信息：

MemTotal:8288512kb

此次编译在飞腾麒麟V10下进行，机器详细信息如下：

```
Linux localhost.localdomain 4.19.90-vhulk2001.1.0.0026.ns7.15.aarch64 #1 SMP Sun Apr 19 22:34:29 CST 2020 aarch64 aarch64 aarch64 GNU/Linux
```

```
NAME="Kylin Linux Advanced Server"

VERSION="V10 (Azalea)"

ID="kylin"

ID_LIKE="fedora"

VARIANT="Server"

VARIANT_ID="server"

VERSION_ID="V10"

PRETTY_NAME="Kylin Linux Advanced Server V10 (Azalea)"

ANSI_COLOR="0;31"

CPE_NAME="cpe:/o:kylin:enterprise_linux:V10:GA:server"

HOME_URL="https://www.kylinos.cn/%22

BUG_REPORT_URL="https://bugzilla.kylinos.cn/bugzilla/%22

KYLIN_BUGZILLA_PRODUCT="Kylin Linux Advanced Server 10"

KYLIN_BUGZILLA_PRODUCT_VERSION=V10

KYLIN_SUPPORT_PRODUCT="Kylin Linux Advanced Server"

KYLIN_SUPPORT_PRODUCT_VERSION="V10"
```

## 介质编译

### 1.  openGauss-third_party

这个仓库用来编译openGauss依赖的所有开源三方软件。

有四个目录

a. build目录包括可以构建我们所依赖的所有第三方的脚本。

b. buildtools包括用于编译这些opensources和openGauss服务器的构建工具。

c. dependency包括openGauss服务器的所有依赖的开源组件。

d. platform包括openjdk等开源软件。

（1）相关依赖

以下列举了编译openGauss的软件要求。

(cmake,gcc,python必须要装，其他的尽量装，没有全部装完也可尝试进行编译)

a. libaio-devel

b. ncurses-devel

c. pam-devel

d. libffi-devel

e. libtool

f. libtool-devel

g. libtool-ltdl

h. python-devel

i. openssl-devel

j. lsb_release(kylin-phytium中介质包名为neokylin-lsb)

k. bison

l. cmake

m. gcc

说明：cmake，gcc有严格的版本要求，cmake版本大于3.16.5，gcc版本必须为7.3.0。

python3请自行编译，并设置好环境变量，此处不做说明。cmake，gcc安装后续单独描述。其他相关依赖请用yum install进行安装。如果受限于网络问题，请挂载Kylin iso进行安装。

安装cmake和gcc之前，请先安装好python3以及以上描述的软件。

（2）安装cmake

cmake选择的版本为cmake-3.17.1，安装路径为/home/opengauss/3rd/cmake(此后相关依赖都安装在/home/opengauss/3rd下)。安装步骤如下：

```
tar –zxvf cmake-3.17.1.tar.gz
./bootstrap --prefix=/home/opengauss/3rd/cmake-3.17.1
make –j4
make install
```

（3） 安装gcc

gcc安装需要依赖gmp、mpfr、mpc，版本分别选择gmp-6.2.0、mpfr-4.0.2、 mpc-1.1.0。安装步骤如下：

1）gmp

```
tar –zxvf gmp-6.2.0.tar.gz
cd gmp-6.2.0
./configure --prefix=/home/opengauss/3rd/gmp-6.2.0 --build=x86 CFLAGS=-fPIC
make –j4
make install
```

2）mpfr

```
tar –zxvf mpfr-4.0.2.tar.gz
cd mpfr-4.0.2
./configure --prefix=/home/opengauss/3rd/mpfr-4.0.2
--with-gmp=/home/opengauss/3rd/gmp-6.2.0
make –j4
make install
```

3）mpc

```
tar –zxvf mpc-1.1.0.tar.gz
cd mpc-1.1.0
./configure --prefix=/home/opengauss/3rd/mpc-1.1.0
--with-gmp=/home/opengauss/3rd/gmp-6.2.0 --with-mpfr=/home/opengauss/3rd/mpfr-4.0.2
make –j4
make install
```

4）gcc

```
tar –zxvf gcc-7.3.0
cd gcc-7.3.0
export
LD_LIBRARY_PATH=/home/opengauss/3rd/gmp-6.2.0/lib:/home/opengauss/3rd/mpfr-4.0.2/lib:/home/opengauss/3rd/mpc-1.1.0/lib:$LD_LIBRARY_PATH
./configure --prefix=/home/opengauss/3rd/gcc-7.3.0
--with-gmp=/home/opengauss/3rd/gmp-6.2.0 --with-mpfr=/home/opengauss/3rd/mpfr-4.0.2
--with-mpc=/home/opengauss/3rd/mpc-1.1.0
make –j4
make install
```

（4）编译openGauss-third_party

将opengauss-openGauss-third_party-2.0.0.zip放到目录/home/opengauss下，解压。

```
cd openGauss-third_party
```

默认编译命令会并发执行编译，会占用很大内存，如果内存不够，那么使用find . -name "*.sh" | xargs grep "make" | grep j查找到所有的make语句，然后把-sj或者-sj${cpus_num} 或者 –sj 8 这样的字符删除，改为单线程执行。或者根据机器本身的核数以及内存大小自行修改。

设置环境变量：

```
export CMAKEROOT=/home/opengauss/3rd/cmake-3.17.1
export GCC_PATH=/home/opengauss/3rd/gcc-7.3.0
export CC=$GCC_PATH/bin/gcc
export CXX=$GCC_PATH/bin/g++
export
LD_LIBRARY_PATH=$GCC_PATH/lib64:/home/opengauss/3rd/mpc-1.1.0/lib:/home/opengauss/3rd/mpfr-4.0.2/lib:/home/opengauss/3rd/gmp-6.2.0/lib:$CMAKEROOT/lib:$LD_LIBRARY_PATH
export PATH=$CMAKEROOT/bin:$PATH
```

编译步骤如下：

```
cd /home/opengauss/openGauss-third_party/build
sh build_all.sh
```

编完以后，会将结果输出到/home/opengauss/openGauss-third_party/output中。

/home/opengauss/openGauss-third_party/output即为openGauss-server依赖的三方介质目录。

### 2. openGauss-server

这个仓库用来编译gaussdb二进制执行文件。

（1）相关依赖

以下列举了编译openGauss的软件要求。

建议使用从操作系统安装盘或安装源中获取的以下依赖软件的默认安装包进行安装。如果不存在以下软件，请参考推荐的软件版本。（没有全部安装完也可尝试进行编译）

| 软件 | 版本 |
| --- | ---|
| libaio-devel | 0.3.109-13 |
| flex | 2.5.31及以上版本 |
| bison | 2.7-4 |
| ncurses-devel | 5.9-13.20130511 |
| glibc-devel | 2.17-111 |
| patch | 2.7.1-10 |
| readline-devel | 7.0-13 |

（2）编译openGauss-server

将opengauss-openGauss-server-v2.0.0.tar.gz放到目录/home/opengauss，解压。

```
cd openGauss-server
```

默认编译命令会并发执行编译，会占用很大内存，如果内存不够，那么使用find . -name "*.sh" | xargs grep "make" | grep j查找到所有的make语句，然后把-sj或者-sj${cpus_num} 或者 –sj 8 这样的字符删除，改为单线程执行。或者根据机器本身的核数以及内存大小自行修改。

设置环境变量：

```
export CODE_BASE=`pwd`
export BINARYLIBS=`pwd`/../openGauss-third_party/output
export GAUSSHOME=$CODE_BASE/dest
export GCC_PATH=/home/opengauss/3rd/gcc-7.3.0
export CC=$GCC_PATH/bin/gcc
export CXX=$GCC_PATH/bin/g++
export
LD_LIBRARY_PATH=$GCC_PATH/lib64:/home/opengauss/3rd/mpc-1.1.0/lib:/home/opengauss/3rd/mpfr-4.0.2/lib:/home/opengauss/3rd/gmp-6.2.0/lib:$LD_LIBRARY_PATH
export PATH=$GCC_PATH/bin:$PATH
```

编译步骤如下：

```
./configure --gcc-version=7.3.0 CC=g++ CFLAGS="-O2 -g3" --prefix=$GAUSSHOME --3rd=$BINARYLIBS --enable-thread-safety --with-readline --without-zlib
make –j4
make install
```

编译过程中会报很多错误，依次解决完以后，编译结果会输出到$GAUSSHOME目录下。

（3）错误解决

将openGauss-third_party_binarylibs.tar.gz放到目录/home/opengauss。

```
cd /home/opengauss

tar –zxvf openGauss-third_party_binarylibs.tar.gz
```

编译出错的大部分原因，是介质编译 > openGauss-third_party > 编译openGauss-third_party步骤中编译好的3rd缺少一些动态库和头文件，主要有两种解决方案：

1）cd openGauss-third_party/dependency，进入对应的库目录，参照README.md，进行编译，编译完的结果会输出到openGauss-third_party/output/dependency/kylin_aarch64

2）直接拷贝openGauss-third_party_binarylibs/dependency/openeuler_aarch64目录下对应的库到openGauss-third_party/output/dependency/kylin_aarch64(该方式存在一个问题，有些库直接拷贝过来用不了，缺一些函数符号)

说明：为避免后续步骤出错，建议选择第一种方案。

以下进行错误分析及解决：

1）../../../../../src/include/access/obs/obs_am.h:33:10: 致命错误：eSDKOBS.h：没有那个文件或目录

问题原因：openGauss-third_party/output中缺少libobs库。

解决办法：openGauss-third_party/dependency中没有libobs源码，选择第二种解决方案。

```
cp -r openGauss-third_party_binarylibs/dependency/openeuler_aarch64/libobs openGauss-third_party/output/dependency/kylin_aarch64
```

2）../../../../src/include/gs_policy/gs_string.h:32:10: 致命错误：boost/functional/hash.hpp：没有那个文件或目录

问题原因：openGauss-third_party/output中缺少boost库。

解决办法：openGauss-third_party/dependency中有boost源码。但是编译流程较为复杂。同时经验证，openGauss-third_party_binarylibs下的boost库能正常使用。因此选择第二种解决方案。

```
cp -r openGauss-third_party_binarylibs/dependency/openeuler_aarch64/boost openGauss-third_party/output/dependency/kylin_aarch64
```

3）cipherfn.cpp:1231:5: 错误：‘krb5_set_profile_path’在此作用域中尚未声明

问题原因：openGauss-third_party/output中缺少 kerberos库。

解决办法：openGauss-third_party_binarylibs/dependency中的kerberos库不可用，选择第一种解决方案。

```
cd openGauss-third_party/dependency/kerberos

python build.py -m all -f krb5-1.17.1.tar.gz -t "comm|llt"
```

编译报错：

/home/oepngauss/3rd/gcc-7.3.0/lib/gcc/aarch64-unknown-linux-gnu/7.3.0/include-fixed/openssl/bn.h:138:11: 致命错误：openssl/e_os2.h：没有那个文件或目录

解决：

```
export C_INCLUDE_PATH=/home/opengauss/openGauss-third_party/output/dependency/kylin_aarch64/openssl/comm/include
```

继续执行python build.py -m all -f krb5-1.17.1.tar.gz -t "comm|llt"

继续报错：

make[2]: *** 没有规则可以创建“binutils.versions”需要的目标“libcom_err_gauss.exports”。停止。（会有好几个类似的错误，统一解决后再继续编译）

解决：

```
cd /home /opengauss/openGauss-third_party/dependency/kerberos/krb5-1.17.1/src/util/et/

cp –r libcom_err.exports libcom_err_gauss.exports

cd /home /opengauss/openGauss-third_party/dependency/kerberos/krb5-1.17.1/src/lib/krb5

cp –r libkrb5.exports libkrb5_gauss.exports

cd /home /opengauss/openGauss-third_party/dependency/kerberos/krb5-1.17.1/src/lib/crypto

cp –r libk5crypto.exports libk5crypto_gauss.exports

cd /home /opengauss/openGauss-third_party/dependency/kerberos/krb5-1.17.1/src/lib/rpc

cp –r libgssrpc.exports libgssrpc_gauss.exports

cd /home /opengauss/openGauss-third_party/dependency/kerberos/krb5-1.17.1/src/lib/gssapi

cp –r libgssapi_krb5.exports libgssapi_krb5_gauss.exports
```

继续执行python build.py -m all -f krb5-1.17.1.tar.gz -t "comm|llt"

继续报错：

openssl.so：在函数‘unmarshal_w’中：

openssl.c:(.text+0x330)：对‘BN_set_flags’未定义的引用

openssl.so：在函数‘ossl_hash’中：

openssl.c:(.text+0x8b8)：对‘EVP_MD_CTX_new’未定义的引用

openssl.c:(.text+0x9ac)：对‘EVP_MD_CTX_free’未定义的引用

解决：

```
cp /home/opengauss/openGauss-third_party_binarylibs/dependency/kylin_aarch64/openssl/comm/lib/libcrypto.so /home/opengauss/openGauss-third_party/dependency/kerberos/krb5-1.17.1/src/lib

cp /home/opengauss/openGauss-third_party_binarylibs/dependency/kylin_aarch64/openssl/comm/lib/libssl.so /home/opengauss/openGauss-third_party/dependency/kerberos/krb5-1.17.1/src/lib
```

继续执行python build.py -m all -f krb5-1.17.1.tar.gz -t "comm|llt"

说明：如果解决完一个问题以后，接着编译的话，会出现以下类似的提示：

```
The next patch would create the file src/lib/crypto/libk5crypto_gauss.exports,which already exists! Assume -R? [n]
```

如果输入y，会自动将libcom_err_gauss.exports，ibkrb5_gauss.exports，libk5crypto_gauss.exports，libgssrpc_gauss.exports，libgssapi_krb5_gauss.exports这五个文件删除，所以在输入y以后，需要立刻把这五个文件复制一份。

建议：将以上问题的解决方式提前处理好，再进行编译。

4）../../../../src/include/gs_policy/curl_utils.h:17:10: 致命错误：curl/curl.h：没有那个文件或目录

问题原因：openGauss-third_party/output中缺少libcurl库。

解决办法：openGauss-third_party/dependency中有libcurl源码，但是编译流程较为复杂。同时经验证， openGauss-third_party_binarylibs下的libcurl库能正常使用。因此选择第二种解决方案。

```
cp -r openGauss-third_party_binarylibs/dependency/openeuler_aarch64/libcurl openGauss-third_party/output/dependency/kylin_aarch64
```

5）client_logic.cpp:50:10: 致命错误：MurmurHash3.h：没有那个文件或目录

costsize.cpp:94:10: 致命错误：hll.h：没有那个文件或目录

问题原因：openGauss-third_party/output中缺少postgresql-hll库。

解决办法：openGauss-third_party/dependency中有postgresql-hll源码，选择第一种解决方案。

```
cd openGauss-third_party/dependency/postgresql-hll

sh build.sh –m all
```

编译完成后只有lib文件夹，缺少include，去openGauss-third_party_binarylibs拷贝。

```
cp -r openGauss-third_party_binarylibs/dependency/openeuler_aarch64/postgresql-hll /comm/include openGauss-third_party/output/dependency/kylin_aarch64/postgresql-hll/comm
```

6）../../../../src/include/access/dfs/dfs_query.h:29:10: 致命错误：orc/Exceptions.hh：没有那个文件或目录

问题原因：openGauss-third_party/output中缺少liborc库。

解决办法：openGauss-third_party/dependency中没有liborc源码，选择第二种解决方案。

```
cp -r openGauss-third_party_binarylibs/dependency/openeuler_aarch64/liborc openGauss-third_party/output/dependency/kylin_aarch64
```

7）remote_read.pb.h:10:10: 致命错误：google/protobuf/port_def.inc：没有那个文件或目录

问题原因：openGauss-third_party/output中缺少protobuf库。

解决办法：openGauss-third_party/dependency有protobuf源码，选择第一种解决方案。

```
cd openGauss-third_party/dependency/protobuf

python build.py -m all -f protobuf-3.11.3.zip -t "comm|llt"
```

8）remote_read.grpc.pb.h:10:10: 致命错误：grpc/impl/codegen/port_platform.h：没有那个文件或目录

问题原因：openGauss-third_party/output中缺少grpc库。

解决办法：openGauss-third_party/dependency中有grpc源码，但是编译流程较为复杂，同时经验证，openGauss-third_party_binarylibs下的grpc库能正常使用。因此选择第二种解决方案。

```
cp -r openGauss-third_party_binarylibs/dependency/openeuler_aarch64/grpc openGauss-third_party/output/dependency/kylin_aarch64
```

9）parquet_file_reader.h:27:10: 致命错误：parquet/api/reader.h：没有那个文件或目录

问题原因：openGauss-third_party/output中缺少libparquet库。

解决办法：openGauss-third_party/dependency中没有libparquet源码，采用第二种解决方案。

```
cp -r openGauss-third_party_binarylibs/dependency/openeuler_aarch64/libparquet openGauss-third_party/output/dependency/kylin_aarch64
```

10）/usr/bin/ld: 找不到 –lthrift

问题原因：openGauss-third_party/output中缺少libthrift库。

解决办法：openGauss-third_party/dependency中有libthrift源码，选择第一种解决方案。

```
cd openGauss-third_party/dependency/libthrift

sh ./build.sh
```

11）/usr/bin/ld: 找不到 -lsnappy

问题原因：openGauss-third_party/output中缺少snappy库。

解决办法：openGauss-third_party/dependency中有snappy源码，选择第一种解决方案。

```
cd openGauss-third_party/dependency/snappy

sh ./build.sh
```

12）/usr/bin/ld: 找不到 -lzstd

问题原因：openGauss-third_party/output中缺少zstd库。

解决办法：openGauss-third_party/dependency中有zstd源码，选择第一种解决方案。

```
cd openGauss-third_party/dependency/zstd

sh ./build.sh
```

13）/home/opengauss/openGauss-server/../openGauss-third_party/output/dependency/kylin_aarch64/libobs/comm/lib/libxml2.so：对‘fcntl64@GLIBC_2.28’未定义的引用

问题原因：编译过程中找的是openGauss-third_party/output/dependency/kylin_aarch64/libobs下的libxml2.so，其缺少‘fcntl64@GLIBC_2.28’。

解决办法：openGauss-third_party/dependency有libxml2源码，但是在编译过程中，存在压缩包libxml2-2.9.9.tar.gz无法解压的问题。同时整个libobs也是从openGauss-third_party_binarylibs拷贝过来的，所以第一种解决方案和第二种解决方案都无法解决此问题。

find / -name “libxml2*”，可以在/usr/lib64下找到libxm12.so*库

```
cp –r /usr/lib64/libxml2.so.2.9.1 openGauss-third_party/output/dependency/kylin_aarch64/libobs/comm/lib

cd openGauss-third_party/output/dependency/kylin_aarch64/libobs/comm/lib

ln –s libxml2.so.2.9.1 libxml2.so.2

ln –s libxml2.so.2.9.1 libxml2.so
```

如果openGauss-third_party/output/dependency/kylin_aarch64/libobs/comm/lib目录下原本就存在libxml2.so*文件， 请先备份。

以下为make install出现的错误：

14）./zic: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory

问题原因：找不到libssl.so.1.1。

解决办法：find / -name “libssl.so.1.1”可以发现在

/home/opengauss/openGauss-third_party/output/dependency/kylin_aarch64/openssl/comm/lib下。因此设置环境变量：

```
export LD_LIBRARY_PATH=/home/opengauss/openGauss-third_party/output/dependency/kylin_aarch64/openssl/comm/lib:$LD_LIBRARY_PATH
```

15）cp: 无法获取"/home/opengauss/openGauss-server/../openGauss-third_party/output/buildtools/kylin_aarch64/gcc7.3/gcc/lib64/libstdc++.so.6" 的文件状态(stat): 没有那个文件或目录

问题原因：openGauss-third_party/output/buildtools中缺少gcc。

解决办法：将编译好的gcc文件夹拷贝过去。

```
cd openGauss-third_party/output/buildtools

mkdir -p kylin_aarch64/gcc7.3

cd kylin_aarch64/gcc7.3

cp -r /home/opengauss/3rd/gcc-7.3.0 .

mv gcc-7.3.0 gcc
```

16）cp: 无法获取"/home/opengauss/openGauss-server/../openGauss-third_party/output/dependency/kylin_aarch64/pljava/comm/lib/*" 的文件状态(stat): 没有那个文件或目录

问题原因：openGauss-third_party/output中缺少pljava库。

解决办法：openGauss-third_party/dependency中有pljava源码，但是编译流程较为复杂，同时经验证，openGauss-third_party_binarylibs下的pljava库能正常使用。因此选择第二种解决方案。

```
cp -r openGauss-third_party_binarylibs/dependency/openeuler_aarch64/pljava openGauss-third_party/output/dependency/kylin_aarch64
```

欢迎访问openGauss官方网站

openGauss开源社区官方网站：

https://opengauss.org/ [了解详情](https://opengauss.org)

openGauss组织仓库：

https://gitcode.com/opengauss [了解详情](https://gitcode.com/opengauss)

openGauss镜像仓库：

https://github.com/opengauss-mirror [了解详情](https://github.com/opengauss-mirror)

本页内容
