# 2 编译环境

### 1、配置编译机 <a href="#ip5fc" id="ip5fc"></a>

在Mac和Windows上，交叉编译linux版本的服务程序也是可以的，不过一般公司会配置专门的编译机，代码提交到git（或svn）库里，由编译机pull并编译。

开发和正式编译的环境应尽量隔离，可以避免因开发漏提交，或配置不同导致的项目编译异常。一份合格的代码，在每个编译环境下，产出的程序都应该是一致的。

随着流程的标准化，公司基本都会推进**自动化编译**流程，将开发人员和编译环境进一步解耦，只需在网页上操作，即可进行编译和导出。

接下来，我们在Rocky上搭建编译环境。

首先，通过ssh登陆到Rocky服务器上。

#### 1.1 更新系统 <a href="#rgszz" id="rgszz"></a>

首先更新系统，保证系统内补丁包处于最新状态

```
sudo dnf update
sudo dnf clean all
```

<br>

```
上次元数据过期检查：1:16:28 前，执行于 2023年01月11日 星期三 18时50分52秒。
依赖关系解决。
================================================================================
 软件包            架构   版本                                  仓库       大小
================================================================================
安装:
 kernel            x86_64 5.14.0-162.6.1.el9_1.0.1              baseos    1.8 M
升级:
 bpftool           x86_64 5.14.0-162.6.1.el9_1.0.1              baseos    2.6 M
 firefox           x86_64 102.6.0-1.el9_1                       appstream 106 M
 glx-utils         x86_64 8.4.0-12.20210504git0f9e7d9.el9.0.1   appstream  40 k
 kernel-tools      x86_64 5.14.0-162.6.1.el9_1.0.1              baseos    2.1 M
 kernel-tools-libs x86_64 5.14.0-162.6.1.el9_1.0.1              baseos    1.9 M
 krb5-libs         x86_64 1.19.1-24.el9_1                       baseos    718 k
 python3-perf      x86_64 5.14.0-162.6.1.el9_1.0.1              baseos    2.0 M
 rocky-gpg-keys    noarch 9.1-1.11.el9                          baseos     12 k
 rocky-release     noarch 9.1-1.11.el9                          baseos     22 k
 rocky-repos       noarch 9.1-1.11.el9                          baseos     12 k
 tzdata            noarch 2022g-1.el9_1                         baseos    427 k
安装依赖关系:
 kernel-core       x86_64 5.14.0-162.6.1.el9_1.0.1              baseos     45 M
 kernel-modules    x86_64 5.14.0-162.6.1.el9_1.0.1              baseos     33 M

事务概要
================================================================================
安装   3 软件包
升级  11 软件包

总下载：196 M
确定吗？[y/N]
```

根据提示，安装完毕！

#### 1.2 安装GCC <a href="#qiitm" id="qiitm"></a>

Rocky Linux和许多其他基于RedHat的Linux发行版，都附带了一个名为“Development tools”（开发工具）的包，用于在Linux系统上构建和编译软件。此包包含GCC、g++、make、libtool、rpmbuild、Autoconf等。可以通过运行以下命令检查“Development tools”包是否适用于当前系统。

```
sudo dnf group list
```

查看输出

```
可用环境组：
   服务器
   最小安装
   工作站
   定制操作系统
   虚拟化主机
已安装的环境组：
   带 GUI 的服务器
已安装组：
   容器管理
   无头系统管理
可用组：
   传统 UNIX 兼容性
   控制台互联网工具
   开发工具
   .NET Development
   图形管理工具
   网络服务器
   RPM 开发工具
   科学记数法支持
   安全性工具
   智能卡支持
   系统工具
```

在可用组中包含开发工具，可以继续安装

```
sudo dnf groupinstall "Development Tools"
```

控制台展示所有需要安装的工具列表及依赖关系

```
安装组:
 Development Tools                                                             

事务概要
================================================================================
安装  105 软件包

总下载：154 M
安装大小：566 M
确定吗？[y/N]： 
```

安装完成后，通过以下命令查看已安装的组件

```
组：开发工具
 描述：基本开发环境。
 必要的软件包：
   autoconf
   automake
   binutils
   bison
   flex
   gcc
   gcc-c++
   gdb
   glibc-devel
   libtool
   make
   pkgconf
   pkgconf-m4
   pkgconf-pkg-config
   redhat-rpm-config
   rpm-build
   rpm-sign
   strace
 默认的软件包：
   asciidoc
   byacc
   diffstat
   git
   intltool
   jna
   ltrace
   patchutils
   perl-Fedora-VSP
   perl-generators
   pesign
   source-highlight
   systemtap
   valgrind
   valgrind-devel
 可选的软件包：
   cmake
   expect
   rpmdevtools
   rpmlint
```

查看gcc版本信息

```
gcc -v


使用内建 specs。
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/11/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
目标：x86_64-redhat-linux
配置为：../configure --enable-bootstrap --enable-host-pie --enable-host-bind-now --enable-languages=c,c++,fortran,lto --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://bugs.rockylinux.org/ --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-gcc-major-version-only --with-linker-hash-style=gnu --enable-plugin --enable-initfini-array --without-isl --enable-offload-targets=nvptx-none --without-cuda-driver --enable-gnu-indirect-function --enable-cet --with-tune=generic --with-arch_64=x86-64-v2 --with-arch_32=x86-64 --build=x86_64-redhat-linux --with-build-config=bootstrap-lto --enable-link-serialization=1
线程模型：posix
Supported LTO compression algorithms: zlib zstd
gcc 版本 11.3.1 20220421 (Red Hat 11.3.1-2) (GCC) 
```

查看gcc位置

```
$ whereis gcc
gcc: /usr/bin/gcc /usr/lib/gcc /usr/libexec/gcc /usr/share/man/man1/gcc.1.gz /usr/share/info/gcc.info.gz
```

#### 1.3 安装cmake <a href="#pycxw" id="pycxw"></a>

从上面的软件包中可以看到，cmake并没有被默认安装，通过以下命令实现

```
sudo dnf install cmake
```

安装完成后，查看版本信息

```
$ cmake --version
cmake version 3.20.2
```

### 2、更新代码编译 <a href="#lbkdj" id="lbkdj"></a>

在安装Development Tools时，已经安装了git，我们可以查看git版本

```
$ git --version
git version 2.31.1
```

通过git将代码pull到本地，我们将代码放到目录 /data/code

跳转到data目录，创建code文件夹

```
$cd /data
$sudo mkdir code
$ls
code  service
```

使用git clone 命令将代码更新到本地

```
[code]$ ls
chatservice  simpleservice
```

进入到simpleservice/build 目录下，执行"cmake .."，因为CMakeLists文件与build目录同层，因此返回上层查找，而生成的临时文件都放在build目录下。

然后执行make命令，生成libServiceBase.a文件。

进入chatservice目录，创建lib和build目录，拷贝libServiceBase.a文件到lib目录下

```
[chatservice]# cp ../lib/libServiceBase.a lib/
```

与simpleservice相同，进入build目录，执行"cmake .."，然后执行make命令。

在bin目录下生成ChatService程序。

将程序从服务器拷贝到本地，新开一个终端，执行scp命令

```
scp root@192.168.0.120:/data/code/chatservice/bin/ChatService /users/用户名/
```

至此，linux版本的chatservice编译完成。
