C++程序在Ubuntu上如何部署
导读:在 Ubuntu 上部署 C++ 程序的标准流程 一 准备与构建 安装基础工具链:更新索引并安装 build-essential(包含 g++/gcc、make 等),以及 cmake(管理多文件与依赖)。 命令:sudo apt u...
在 Ubuntu 上部署 C++ 程序的标准流程
一 准备与构建
- 安装基础工具链:更新索引并安装 build-essential(包含 g++/gcc、make 等),以及 cmake(管理多文件与依赖)。
- 命令:
sudo apt update & & sudo apt install -y build-essential cmake - 验证:
gcc --version、g++ --version、cmake --version
- 命令:
- 选择工具链:
- GCC:
sudo apt install g++ - Clang:
sudo apt install clang
- GCC:
- 构建方式
- 单文件:
g++ main.cpp -o myapp -O2 -Wall -g -std=c++17 - 多文件/工程:使用 CMake
- 示例 CMakeLists.txt
cmake_minimum_required(VERSION 3.10) project(MyApp LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_BUILD_TYPE Release) add_executable(myapp src/main.cpp src/foo.cpp) - 构建:
mkdir -p build & & cd build & & cmake -DCMAKE_BUILD_TYPE=Release .. & & make -j$(nproc)
- 示例 CMakeLists.txt
- 单文件:
- 建议产物与目录
- 可执行文件放入:/opt/yourapp/bin
- 配置放入:/etc/yourapp/
- 数据与日志放入:/var/lib/yourapp/、/var/log/yourapp/
二 运行与进程管理
- 直接运行(测试阶段)
- 前台:
./myapp - 后台:
nohup ./myapp > /var/log/yourapp/app.log 2> & 1 & - 查看端口/进程:
ss -ltnp | grep 8080、ps aux | grep myapp
- 前台:
- 使用 systemd 托管(生产推荐)
-
创建服务:`sudo tee /etc/systemd/system/yourapp.service > /dev/null < < ‘EOF’ [Unit] Description=My C++ Application After=network.target
[Service] Type=simple ExecStart=/opt/yourapp/bin/myapp WorkingDirectory=/opt/yourapp User=www-data Group=www-data Restart=always RestartSec=5 StandardOutput=journal StandardError=journal Environment=APP_ENV=production
[Install] WantedBy=multi-user.target EOF`
-
启用与启动:
sudo systemctl daemon-reload & & sudo systemctl enable --now yourapp -
常用运维:
sudo systemctl status yourapp、sudo journalctl -u yourapp -f
-
三 网络发布与反向代理
- 直接监听端口(仅内网或受信网络)
- 示例(Crow 框架):
app.port(8080).multithreaded().run();
- 示例(Crow 框架):
- 使用 Nginx 反向代理(生产推荐)
- 安装:
sudo apt install -y nginx - 站点配置(/etc/nginx/sites-available/yourapp):
server { listen 80; server_name yourdomain.com; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } - 启用与生效:
sudo ln -s /etc/nginx/sites-available/yourapp /etc/nginx/sites-enabled/ & & sudo nginx -t & & sudo systemctl reload nginx
- 安装:
- 可选:作为 FastCGI 运行(如 CppCMS/Wt),Nginx 使用
fastcgi_pass转发到应用监听的 Unix socket 或 TCP。
四 依赖处理与交付方式
- 运行时依赖
- 优先使用 Ubuntu 官方仓库安装依赖(如 libboost-all-dev 等),减少外部二进制不兼容风险。
- 第三方库建议随应用打包(私有 .deb 或 tar.gz),并在 systemd 服务中设置 LD_LIBRARY_PATH 或 /etc/ld.so.conf.d/yourapp.conf 指向私有库目录。
- 静态链接
- 发布为单一可执行文件时,可在 CMake 中启用静态链接(如
-DBUILD_SHARED_LIBS=OFF并链接静态库),但注意许可与体积权衡。
- 发布为单一可执行文件时,可在 CMake 中启用静态链接(如
- 容器化交付(Docker)
- 示例 Dockerfile
FROM ubuntu:22.04 RUN apt update & & apt install -y g++ cmake & & rm -rf /var/lib/apt/lists/* WORKDIR /app COPY . . RUN mkdir -p build & & cd build & & cmake -DCMAKE_BUILD_TYPE=Release .. & & make -j$(nproc) CMD ["./build/myapp"] - 构建与运行:
docker build -t yourapp:latest . & & docker run -d -p 8080:8080 --name yourapp yourapp:latest
- 示例 Dockerfile
- 交付清单
- 可执行文件、配置模板、systemd 单元文件、必要脚本(如数据库迁移)、systemd 日志与轮转配置(如 logrotate)、健康检查脚本。
五 验证与常见问题
- 快速自检
- 服务健康:
curl -I http://localhost/、ss -ltnp | grep 8080 - 日志排查:
sudo journalctl -u yourapp -f - 资源监控:
top/htop、/proc/< pid> /status
- 服务健康:
- 常见问题
- 端口被占用:
sudo lsof -iTCP:8080 -sTCP:LISTEN或ss -ltnp | grep 8080 - 动态库找不到:检查 LD_LIBRARY_PATH、
ldd myapp输出、或/etc/ld.so.conf.d/ - 权限问题:确保运行用户(如 www-data)对可执行文件、工作目录、日志目录具备相应权限。
- 构建/运行标准不一致:统一 C++ 标准(如 -std=c++17)、优化级别(发布用 -O2/-O3)、调试信息(开发用 -g)。
- 端口被占用:
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: C++程序在Ubuntu上如何部署
本文地址: https://pptw.com/jishu/789793.html
