CentOS 上如何部署 C++ 程序:从编译到 systemd 托管

江岸
江岸
发布时间:2026-08-23| 190人浏览过
原创

前言

把 C++ 程序部署到 CentOS,真正容易出问题的通常不是上传文件这一步,而是编译器版本、动态库依赖和服务托管细节。本文按实际部署链路梳理一遍:从工具链准备、项目构建,到依赖检查、服务器启动和 systemd 接管,读完你可以判断自己的项目该如何编译、缺库该怎么查,以及上线后怎样把服务稳定管起来。

把 C++ 程序部署到 CentOS,表面上看只是上传一个可执行文件,真正决定能不能稳定运行的,往往是编译器版本、动态库依赖和服务管理方式。下面按实际部署顺序拆开讲:先准备编译环境,再处理构建与依赖,最后把程序放到服务器上运行,并用 systemd 接管,方便后续维护和重启自启。

准备 CentOS 编译环境

如果你打算直接在 CentOS 上编译 C++ 项目,第一步是把基础工具链装齐,包括 GCC/G++、常用开发工具和 CMake。

sudo yum update -y
sudo yum groupinstall -y "Development Tools"
sudo yum install -y cmake

这组命令适合大多数常规项目。如果项目要求更新版本的 GCC,例如 10.x,可以通过 Software Collections(SCL)安装,不会覆盖系统自带编译器:

sudo yum install -y centos-release-scl
sudo yum install -y devtoolset-10-gcc-c++
scl enable devtoolset-10 bash

这里有一个容易忽略的点:scl enable 只对当前 shell 会话生效。如果你希望后续登录后默认使用这套工具链,需要把相关命令写入 ~/.bashrc。

编译 C++ 程序

项目怎么编译,取决于代码规模和依赖复杂度。单文件程序可以直接用 g++,多文件项目则更适合交给 CMake 管理。

对比单文件 g++ 编译与多文件 CMake 构建流程的信息图
C++ 项目构建方式怎么选把单文件直接编译和多文件 CMake 构建放在一张图里,便于快速判断项目该选哪种方式。

单文件程序:直接用 g++

如果只有一个源文件,最直接的方式就是:

g++ -o myapp main.cpp

生成的 myapp 如果没有额外依赖,通常可以直接复制到服务器执行。

多文件项目:用 CMake 管理构建

当项目包含多个源文件,或者依赖 OpenSSL、Boost 这类库时,建议使用 CMake 来统一管理构建流程。

先在项目根目录准备 CMakeLists.txt:

cmake_minimum_required(VERSION 3.10)
project(MyApp)
add_executable(MyApp main.cpp lib.cpp)
find_package(OpenSSL REQUIRED)
target_link_libraries(MyApp PRIVATE OpenSSL::SSL OpenSSL::Crypto)

然后创建构建目录并执行编译:

mkdir build && cd build
cmake ..
make

编译完成后,可执行文件 MyApp 会出现在 build 目录。对于稍复杂的项目,这种方式比手写长命令更容易维护,也更方便以后切换依赖和编译参数。

部署前先处理依赖库

C++ 程序部署时最常见的问题,不是代码本身,而是服务器上缺少运行时库。依赖通常分为两类:系统库,例如 glibc;第三方库,例如 Boost、OpenSSL。

展示 ldd 检查动态库、库安装方式与 LD_LIBRARY_PATH 处理路径的信息图
动态库依赖如何排查部署前先看依赖是否齐全,这一张图把库来源、检查命令和缺库处理方式串起来。

系统库与开发包安装

系统库通常可以直接通过 yum 安装对应包。以 OpenSSL 为例:

sudo yum install -y openssl-devel

原文给出的做法是安装 -devel 包,这在编译阶段尤其常见。实际部署时,也要确认目标机器具备对应运行时库。

第三方库常见处理方式

第三方依赖一般有几种来源:

  • 直接用 yum 安装现成包,例如 boost-devel;
  • 通过 CMake 的 find_package 自动查找;
  • 使用 vcpkg 这类跨平台包管理器;
  • 手动下载源码编译,并安装到 /usr/local/lib 等目录。

无论采用哪种方式,部署前都建议执行一次动态库检查:

ldd myapp

如果输出中出现 not found,说明某个动态库没有被正确找到。此时可以先临时设置库搜索路径:

export LD_LIBRARY_PATH=/path/to/libs:$LD_LIBRARY_PATH

这一步非常关键。很多“本地能跑、服务器一启动就报错”的问题,最后都落在这里。

上传到服务器并启动程序

确认程序编译完成、依赖也齐全后,就可以把可执行文件传到目标服务器。

用 scp 上传二进制文件

scp myapp user@server_ip:/opt/myapp

上传后登录服务器,进入部署目录并补上执行权限:

ssh user@server_ip
cd /opt/myapp
chmod +x myapp

手动运行与库路径设置

先直接执行,确认程序本身能启动:

./myapp

如果依赖库不在系统默认搜索路径,需要先设置 LD_LIBRARY_PATH:

export LD_LIBRARY_PATH=/opt/myapp/libs:$LD_LIBRARY_PATH
./myapp

如果这条环境变量每次都需要手动设置,可以把 export 写入 ~/.bashrc 或 /etc/profile,减少重复操作。

生产环境建议接入 systemd

如果程序只是临时验证,手动运行已经够用;但只要进入生产环境,通常都建议交给 systemd 管理。这样可以获得开机自启、异常重启和统一状态查看能力。

展示 systemd 服务文件结构、启动命令与日志查看方式的信息图
systemd 托管 C++ 服务要点生产环境的重点不是手动跑起来,而是让服务可自启、可重启、可查看状态。

创建服务文件

先创建服务配置:

sudo nano /etc/systemd/system/myapp.service

写入如下内容,路径、用户和用户组按实际环境调整:

[Unit]
Description=My C++ Application
After=network.target

[Service]
User=myuser
Group=mygroup
ExecStart=/opt/myapp/myapp
Restart=always
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

[Install]
WantedBy=multi-user.target

加载并启用服务

sudo systemctl daemon-reload
sudo systemctl start myapp
sudo systemctl enable myapp

完成后,可以用下面的命令查看服务状态:

systemctl status myapp

对线上服务来说,systemd 的价值不只是“能启动”,而是把运行、重启和状态查询纳入统一管理,后续排障会轻松很多。

安全与维护的几个实用建议

程序上线后,部署工作并没有结束。下面这些细节,往往决定后续维护成本。

安全加固

  • 关闭不必要的端口,使用 firewalld 限制访问范围;
  • 避免直接用 root 运行程序,单独创建普通用户,通过 sudo 提权处理管理操作。

日志查看与输出管理

如果是手动启动程序,可以把输出重定向到日志文件:

./myapp > myapp.log 2>&1 &

如果已经交给 systemd 管理,则可以直接查看:

journalctl -u myapp

备份、监控与依赖更新

  • 定期备份代码和业务数据;
  • 使用 top、htop 观察 CPU、内存等资源占用;
  • 及时更新依赖库,修补已知安全漏洞。

如果把这几项也纳入日常流程,CentOS 上的 C++ 服务基本就能从“能跑”进入“可持续维护”的状态。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。