docker容器配置c++编译环境与生产环境兼容
通过docker容器搭建与生产环境相同的c++编译环境
回忆2025年搭建编译环境流程,并整理当时的参考文章做留档。
当时源码使用的编译环境是ubuntu22的glibc-2.32,但服务器运行环境glibc-2.28,
编译后的dll无法正常运行,于是在docker上以ubuntu18原版镜像为基础,将其glibc-2.27升级为2.28版本,安装g++8,提供编译环境。
参考:Ubuntu 18.04 升级 glibc 至 2.28(手动编译法)_编译2.28版本的glibc-CSDN博客
Ubuntu18.04升级安装GLIBC2.29 - 知乎
ubuntu升级gcc和g++(附切换不同软件版本的办法)_ubuntu18.04更新gcc8 g++8-CSDN博客
环境
docker ubuntu18.04原版镜像
流程
安装开发工具软件包
sudo apt update
# 更新系统软件
sudo apt upgrade
# 安装常用编译工具
sudo apt install build-essential
build-essential包含一系列软件包,gcc、g++、make 等
下载和编译glibc2.28
GNU 官方镜像站下载 glibc 2.28 的源码包链接为http://ftp.gnu.org/gnu/libc/glibc-2.28.tar.gz,这里使用阿里云镜像站的链接https://mirrors.aliyun.com/gnu/glibc/。
使用wget下载
wget https://mirrors.aliyun.com/gnu/glibc/glibc-2.1.2.tar.gz
使用curl下载
curl -O https://mirrors.aliyun.com/gnu/glibc/glibc-2.1.2.tar.gz
解压和编译
tar -zxvf glibc-2.28.tar.gz
cd glibc-2.28
# 准备编译目录
mkdir build
cd build
# 安装编译构建工具GNU AWK,和GNU 语法解析器生成器
sudo apt-get install gawk bison
# 自定义编译路径传入prefix参数,并开始编译
../configure --prefix=/usr/local/glibc-2.28
查询安装gawk bison的原因:因为GLIBC 的源代码编译过程依赖于 gawk 和 bison 来解析语法文件和生成中间代码,缺少它们会导致 make 过程报错。
不过当时系统已有工具了,所以好像没有用到这条命令。
多核加速编译make -j(并行数量),使用nproc命令查询内核数
# 使用 CPU 核心数自动并行
make -j$(nproc)
# 安装
make install
配置库链接
参考文章分别采用了两种方法,CSDN帖子是修改动态链接器的方式,知乎帖是创建软链接。
查询反馈修改动态链接器的风险不小,不过当时本身是给临时编译用的容器做升级,不需要考虑安全因素,所以印象里用的是修改动态链接器方式。知乎帖是升级的glibc2.29版本,不确定使用的libm-2.29.so文件是否在2.28版本也有对应的libm-2.28.so。这里把两个方式都写出来对照吧。
方法A 创建软链接
将安装的libm-2.29.so复制到/lib/x86_64-linux-gnu下
(libm-2.29.so被安装在/usr/local/lib,和--prefix=/usr/local对应)
cp /usr/local/lib/libm-2.29.so /lib/x86_64-linux-gnu/
添加软链接:
ln -sf libm-2.29.so libm.so.6
查验结果:
ldd --version
方法B 修改动态链接器
# 备份当前动态链接器
sudo cp /etc/ld.so.conf /etc/ld.so.conf.bak
# 创建新的配置信息指向2.28库路径
echo "/usr/local/glibc-2.28/lib" | sudo tee /etc/ld.so.conf.d/glibc-2.28.conf
# 更新动态链接器缓存
sudo ldconfig
# 查看调用的glibc版本
ldd --version
安装g++8
当时c++的源码需要g++8编译,于是安装高版本gcc。
# 安装依赖库
sudo apt-get install software-properties-common
# 更新库源
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
# 安装gcc
sudo apt-get install gcc-8
sudo apt-get install g++-8
当时使用的编译命令为
g++-8 -fPIC -std=c++17 -shared test.cpp -o test.so -lstdc++fs

浙公网安备 33010602011771号