You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级Ubuntu22.04后do_postgres出现pg_fprintf未定义符号错误求助

Ubuntu 20.04升级到22.04后do_postgres报错undefined symbol: pg_fprintf的解决方法

问题现象

升级Ubuntu到22.04后,运行Ruby程序时触发以下加载错误:

<internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:85:in `require': /var/lib/gems/3.0.0/gems/do_postgres-0.10.17/lib/do_postgres/do_postgres.so: undefined symbol: pg_fprintf - /var/lib/gems/3.0.0/gems/do_postgres-0.10.17/lib/do_postgres/do_postgres.so (LoadError)
         from <internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:85:in `require'
         from /var/lib/gems/3.0.0/gems/do_postgres-0.10.17/lib/do_postgres.rb:27:in `<top (required)>'
         from <internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:85:in `require'
         from <internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:85:in `require'
         from /var/lib/gems/3.0.0/gems/dm-postgres-adapter-1.2.0/lib/dm-postgres-adapter/adapter.rb:1:in `<top (required)>'
         from <internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:85:in `require'
         from <internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:85:in `require'
         from /var/lib/gems/3.0.0/gems/dm-postgres-adapter-1.2.0/lib/dm-postgres-adapter.rb:1:in `<top (required)>'
         from <internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:160:in `require'
         from <internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:160:in `rescue in require'
         from <internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:149:in `require'
         from /var/lib/gems/3.0.0/gems/dm-core-1.2.1/lib/dm-core/adapters.rb:163:in `load_adapter'
         from /var/lib/gems/3.0.0/gems/dm-core-1.2.1/lib/dm-core/adapters.rb:133:in `adapter_class'
         from /var/lib/gems/3.0.0/gems/dm-core-1.2.1/lib/dm-core/adapters.rb:13:in `new'
         from /var/lib/gems/3.0.0/gems/dm-core-1.2.1/lib/dm-core.rb:230:in `setup'
         from /test/models/db/schema.rb:8:in `<top (required)>'
         from /test/tcpserver.rb:7:in `require_relative'
         from /test/tcpserver.rb:7:in `<main>'
 <internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:85:in `require': cannot load such file -- dm-postgres-adapter (LoadError)
         from <internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:85:in `require'
         from /var/lib/gems/3.0.0/gems/dm-core-1.2.1/lib/dm-core/adapters.rb:163:in `load_adapter'
         from /var/lib/gems/3.0.0/gems/dm-core-1.2.1/lib/dm-core/adapters.rb:133:in `adapter_class'
         from /var/lib/gems/3.0.0/gems/dm-core-1.2.1/lib/dm-core/adapters.rb:13:in `new'
         from /var/lib/gems/3.0.0/gems/dm-core-1.2.1/lib/dm-core.rb:230:in `setup'
         from /test/models/db/schema.rb:8:in `<top (required)>'
         from /test/tcpserver.rb:7:in `require_relative'
         from /test/tcpserver.rb:7:in `<main>'

已尝试操作

  • 卸载PostgreSQL 14并安装12版本开发包,重新安装do_postgres:
sudo apt remove postgres-14 
sudo apt install postgres-server-dev-12
gem uninstall do_postgres
gem install do_postgres
  • 降级libpq到12版本后重新安装do_postgres:
wget http://security.ubuntu.com/ubuntu/pool/main/p/postgresql-12/libpq-dev_12.12-0ubuntu0.20.04.1_amd64.deb
wget http://security.ubuntu.com/ubuntu/pool/main/p/postgresql-12/libpq5_12.12-0ubuntu0.20.04.1_amd64.deb
sudo dpkg -i libpq*.deb
gem uninstall do_postgres
gem install do_postgres
  • 检查库依赖:
root@data:~# ldd /var/lib/gems/3.0.0/gems/do_postgres-0.10.17/lib/do_postgres/do_postgres.so | grep pq
        libpq.so.5 => /lib/x86_64-linux-gnu/libpq.so.5 (0x00007fb756725000)
root@data:~# ls -al /lib/x86_64-linux-gnu/libpq.so.5
lrwxrwxrwx 1 root root 13 Aug 12 02:54 /lib/x86_64-linux-gnu/libpq.so.5 -> libpq.so.5.12
root@data:~# ls -al /lib/x86_64-linux-gnu/libpq.so.5.12
-rw-r--r-- 1 root root 321672 Aug 12 02:54 /lib/x86_64-linux-gnu/libpq.so.5.12
root@data:~# strings /lib/x86_64-linux-gnu/libpq.so.5.12 | grep pg_fprintf # no result

问题分析

pg_fprintf是PostgreSQL 14及以上版本新增的符号,do_postgres 0.10.17版本编译时依赖了该符号,但运行环境使用的PostgreSQL 12/libpq 12中不存在该符号,导致加载失败。

解决方法

方法一:升级do_postgres到兼容版本

do_postgres后续版本已修复跨版本libpq兼容问题,直接安装最新版或兼容PostgreSQL 12的版本:

# 安装最新版
gem install do_postgres
# 或指定兼容版本
gem install do_postgres -v 0.10.20

若项目使用Gemfile,更新文件中的版本号后执行bundle install。

方法二:切换到PostgreSQL 14环境

若业务允许使用PostgreSQL 14,恢复高版本libpq并重新编译do_postgres:

sudo apt install postgresql-14 libpq-dev libpq5
gem uninstall do_postgres
gem install do_postgres

此方法保证编译和运行环境使用相同版本的libpq,符号pg_fprintf可正常调用。

方法三:手动编译do_postgres并指定PostgreSQL 12库

若必须保留PostgreSQL 12,手动编译do_postgres并指定12版本的编译依赖:

# 确保PostgreSQL 12开发包已安装
sudo apt install postgresql-server-dev-12
# 下载指定版本的do_postgres源码
gem fetch do_postgres -v 0.10.17
tar xzf do_postgres-0.10.17.gem
cd do_postgres-0.10.17/ext/do_postgres
# 指定PostgreSQL 12的pg_config路径
ruby extconf.rb --with-pg-config=/usr/lib/postgresql/12/bin/pg_config
# 编译安装
make
make install

内容的提问来源于stack exchange,提问作者Kokizzu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 04:50:34