Rocky Linux 9.4下用cpanm安装DBD::DB2模块失败求助
安装Perl模块DBD::DB2失败问题排查与解决
问题描述
在Rocky Linux 9.4、RHEL及Oracle Linux系统中,使用cpanm安装Perl模块DBD::DB2时失败,执行命令及报错如下:
[root@ol9vm-desk01 ~]# cpanm DBD::DB2 --> Working on DBD::DB2 Fetching http://www.cpan.org/authors/id/R/RO/ROCKETDB/DBD-DB2-1.89.tar.gz ... OK Configuring DBD-DB2-1.89 ... OK Building and testing DBD-DB2-1.89 ... FAIL ! Installing DBD::DB2 failed. See /root/.cpanm/work/1720158884.3245/build.log for details. Retry with --force to force install it.
已完成前置操作
- 已安装Perl 5.32.1,配置信息:
[root@ol9vm-desk01 ~]# perl -V Summary of my perl5 (revision 5 version 32 subversion 1) configuration: Platform: osname=linux osvers=5.15.0-5.76.5.1.el9uek.x86_64 archname=x86_64-linux-thread-multi uname='linux host-100-100-224-49 5.15.0-5.76.5.1.el9uek.x86_64 #2 smp fri dec 9 18:37:36 pst 2022 x86_64 x86_64 x86_64 gnulinux' config_args='-des -Doptimize=none -Dccflags=-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64-v2 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -Dldflags=-Wl,-z,relro -Wl,--as-needed -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Dccdlflags=-Wl,--enable-new-dtags -Wl,-z,relro -Wl,--as-needed -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Dlddlflags=-shared -Wl,-z,relro -Wl,--as-needed -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Dshrpdir=/usr/lib64 -DDEBUGGING=-g -Dversion=5.32.1 -Dmyhostname=localhost -Dperladmin=root@localhost -Dcc=gcc -Dcf_by=Red Hat, Inc. -Dprefix=/usr -Dvendorprefix=/usr -Dsiteprefix=/usr/local -Dsitelib=/usr/local/share/perl5/5.32 -Dsitearch=/usr/local/lib64/perl5/5.32 -Dprivlib=/usr/share/perl5 -Dvendorlib=/usr/share/perl5/vendor_perl -Darchlib=/usr/lib64/perl5 -Dvendorarch=/usr/lib64/perl5/vendor_perl -Darchname=x86_64-linux-thread-multi -Dlibpth=/usr/local/lib64 /lib64 /usr/lib64 -Duseshrplib -Dusethreads -Duseithreads -Dusedtrace=/usr/bin/dtrace -Duselargefiles -Dd_semctl_semun -Di_db -Ui_ndbm -Di_gdbm -Di_shadow -Di_syslog -Dman3ext=3pm -Duseperlio -Dinstallusrbinperl=n -Ubincompat5005 -Uversiononly -Dpager=/usr/bin/less -isr -Dd_gethostent_r_proto -Ud_endhostent_r_proto -Ud_sethostent_r_proto -Ud_endprotoent_r_proto -Ud_setprotoent_r_proto -Ud_endservent_r_proto -Ud_setservent_r_proto -Dscriptdir=/usr/bin -Dusesitecustomize -Duse64bitint' @INC: /usr/local/lib64/perl5/5.32 /usr/local/share/perl5/5.32 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5
- 已安装IBM DB2 Data Server Client v11.5.9.0:
tdbcli@ol9vm-desk01 ~]$ db2level DB21085I This instance or install (instance name, where applicable: "tdbcli") uses "64" bits and DB2 code release "SQL11059" with level identifier "060A010F". Informational tokens are "DB2 v11.5.9.0", "s2310270807", "DYN2310270807AMD64", and Fix Pack "0". Product is installed at "/opt/ibm/db2/V11.5".
- 已成功安装依赖模块DBI:
instmodsh Available commands are: l - List all installed modules m <module> - Select a module q - Quit the program cmd? l Installed modules are: DBI Perl
- 已设置DB2环境变量并尝试安装:
DB2_HOME=/opt/ibm/db2/V11.5 export DB2LIB=/opt/ibm/db2/V11.5/lib64 [root@ol9vm-desk01 ~]# cpanm DBD::DB2 --> Working on DBD::DB2 Fetching http://www.cpan.org/authors/id/R/RO/ROCKETDB/DBD-DB2-1.89.tar.gz ... OK Configuring DBD-DB2-1.89 ... OK Building and testing DBD-DB2-1.89 ... FAIL ! Installing DBD::DB2 failed. See /root/.cpanm/work/1720158884.3245/build.log for details. Retry with --force to force install it.
编译错误详情
编译日志末尾的关键错误:
dbdimp.c: In function ‘dbd_st_cancel’: /usr/local/lib64/perl5/5.32/auto/DBI/DBIXS.h:383:45: warning: unused variable ‘imp_dbh’ [-Wunused-variable] 383 | #define D_imp_dbh_from_sth D_imp_from_child(imp_dbh, imp_dbh_t, imp_sth) | ^~~~~~~ /usr/local/lib64/perl5/5.32/auto/DBI/DBIXS.h:381:39: note: in definition of macro ‘D_imp_from_child’ 381 | type *name = (type*)(DBIc_PARENT_COM(child)) | ^~~~ dbdimp.c:3000:9: note: in expansion of macro ‘D_imp_dbh_from_sth’ 3000 | D_imp_dbh_from_sth; | ^~~~~~~~~~~~~~~~~~ dbdimp.c: In function ‘db2_st_finish’: /usr/local/lib64/perl5/5.32/auto/DBI/DBIXS.h:383:45: warning: unused variable ‘imp_dbh’ [-Wunused-variable] 383 | #define D_imp_dbh_from_sth D_imp_from_child(imp_dbh, imp_dbh_t, imp_sth) | ^~~~~~~ /usr/local/lib64/perl5/5.32/auto/DBI/DBIXS.h:381:39: note: in definition of macro ‘D_imp_from_child’ 381 | type *name = (type*)(DBIc_PARENT_COM(child)) | ^~~~ dbdimp.c:3019:9: note: in expansion of macro ‘D_imp_dbh_from_sth’ 3019 | D_imp_dbh_from_sth; | ^~~~~~~~~~~~~~~~~~ dbdimp.c: In function ‘bind_lob_column_helper’: dbdimp.c:1081:1: warning: control reaches end of non-void function [-Wreturn-type] 1081 | } | ^ dbdimp.c: In function ‘db2_describe’: dbdimp.c:1318:20: warning: ‘db_codepage’ may be used uninitialized in this function [-Wmaybe-uninitialized] 1318 | if ( app_codepage != db_codepage) { | ^ dbdimp.c:1318:20: warning: ‘app_codepage’ may be used uninitialized in this function [-Wmaybe-uninitialized] cc1: some warnings being treated as errors make: *** [Makefile:351: dbdimp.o] Error 1
解决方案建议
1. 调整编译参数,禁用警告转错误
RHEL系系统默认gcc编译参数会将部分警告视为错误,导致编译失败。设置环境变量临时关闭这些警告:
export PERL_MM_OPT="CCFLAGS=-Wno-unused-variable -Wno-return-type -Wno-maybe-uninitialized" export PERL_MB_OPT="--extra_compiler_flags=-Wno-unused-variable --extra_compiler_flags=-Wno-return-type --extra_compiler_flags=-Wno-maybe-uninitialized"
设置完成后重新执行cpanm DBD::DB2。
2. 确保DB2环境变量完全加载
直接加载DB2官方环境配置脚本,确保所有必要变量正确设置:
source /opt/ibm/db2/V11.5/db2profile
建议切换到DB2实例用户(如tdbcli)执行上述命令,再以该用户身份安装模块(不推荐用root安装Perl模块)。
3. 手动下载源码修改编译配置
若上述方法无效,可手动处理源码:
- 解压源码包:
tar zxf DBD-DB2-1.89.tar.gz && cd DBD-DB2-1.89 - 生成Makefile:
perl Makefile.PL - 编辑Makefile,在
CCFLAGS行追加-Wno-unused-variable -Wno-return-type -Wno-maybe-uninitialized - 执行编译安装:
make && make test && make install
4. 尝试强制安装
若编译仅存在警告(无功能性错误),可强制忽略警告安装:
cpanm --force DBD::DB2
注意:强制安装可能忽略潜在问题,需后续验证模块功能是否正常。
内容的提问来源于stack exchange,提问作者alexraio
相关产品推荐
相关产品推荐

