如何编译可在任意Linux发行版运行的Postgres 15二进制文件?
PostgreSQL 15跨Linux发行版通用编译方案
可以实现通用编译,核心是解决动态库依赖的版本差异问题,具体步骤如下:
1. 选择合适的编译基础环境
必须在CentOS 7这类旧版本发行版上编译——旧系统的glibc等核心库版本更低,编译出的二进制能兼容Ubuntu 16/22、CentOS 7等新老发行版,反之在新系统编译的二进制无法在老系统运行。
2. 修改编译配置,强制静态链接依赖库
默认编译会动态链接系统库,导致跨发行版时出现库缺失/版本不匹配(比如你遇到的libldap_r-2.4.so.2错误,就是Ubuntu 22的ldap库命名和CentOS 7不同)。修改configure命令,让PostgreSQL静态链接关键依赖:
cd /home/username/postgres-15/build_postgres ../configure \ --prefix=/home/username/postgres-15/install \ --enable-static \ --disable-shared \ --with-ldap=static \ --with-openssl=static \ --with-readline=static
参数说明:
--enable-static/--disable-shared:优先静态链接PostgreSQL自身库--with-ldap=static/--with-openssl=static:静态链接ldap、openssl等第三方依赖,避免系统库版本差异--with-readline=static:静态链接readline,解决不同发行版的readline库兼容问题
3. 编译并安装
make clean make make install
4. 打包部署
将/home/username/postgres-15/install目录打包,复制到任意Linux发行版即可直接运行——所有依赖已静态编译进二进制,无需依赖系统库。
如果静态链接某些库遇到问题,也可以退而求其次:
- 保留动态链接,但将CentOS 7中必要的动态库(比如
libldap_r-2.4.so.2、libssl.so.10)复制到install/lib目录 - 运行前设置环境变量:
export LD_LIBRARY_PATH=/path/to/postgres/install/lib:$LD_LIBRARY_PATH
内容的提问来源于stack exchange,提问作者evstratovkirill
相关产品推荐
相关产品推荐

