升级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
相关产品推荐
相关产品推荐

