RHEL 8.9环境下安装ROracle 1.3-1.1版本报错求助
解决ROracle 1.3-1.1在RHEL8+R4.4.1下的编译错误
环境信息
- R版本:4.4.1
- 操作系统:RHEL 8.9(内核4.18.0-513.24.1.el8_9.x86_64)
- Oracle客户端版本:23(含JDBC/ODBC及开发rpm包),也曾尝试19.23版本
- 已通过
OCI_INC、OCI_LIB环境变量指定OCI头文件和库路径
编译错误详情
执行R CMD INSTALL ROracle_1.3-1.1.tar.gz时触发gcc编译错误:
* installing to library ‘/export/apps/prod/*****/R/x86_64-redhat-linux-gnu-library/4.4’ * installing *source* package ‘ROracle’ ... ** package ‘ROracle’ successfully unpacked and MD5 sums checked ** using staged installation configure: creating ./config.status config.status: creating src/Makevars ** libs using C compiler: ‘gcc (GCC) 8.5.0 20210514 (Red Hat 8.5.0-20)’ gcc -I"/usr/include/R" -DNDEBUG -I/usr/include/oracle/23/client64 -I/usr/local/include -fpic -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -c rodbi.c -o rodbi.o rodbi.c: In function ‘rociDrvInit’: rodbi.c:532:31: error: format not a string literal and no format arguments [-Werror=format-security] RODBI_ERROR((const char *)errMsg); \ ^~~~~~ rodbi.c:217:15: note: in definition of macro ‘RODBI_ERROR’ error(err) ^~~ rodbi.c:1221:3: note: in expansion of macro ‘RODBI_CHECK_DRV’ RODBI_CHECK_DRV(drv, __FUNCTION__, 1, TRUE, ^~~~~~~~~~~~~~~ rodbi.c: In function ‘rociConInit’: rodbi.c:552:31: error: format not a string literal and no format arguments [-Werror=format-security] RODBI_ERROR((const char *)errMsg); \ ^~~~~~
问题原因
RHEL 8的gcc默认启用了-Werror=format-security编译选项,该选项要求error()这类格式化函数的第一个参数必须是字符串字面量,而ROracle 1.3-1.1的源码中,RODBI_ERROR宏直接传入了变量errMsg,不符合该安全编译规则,导致编译失败。
解决方法
方法1:临时禁用format-security警告(最简单)
安装时通过环境变量添加编译选项,取消该警告的错误触发:
CFLAGS="-Wno-error=format-security" R CMD INSTALL ROracle_1.3-1.1.tar.gz
如果需要指定Oracle库链接选项,可补充LDFLAGS:
CFLAGS="-Wno-error=format-security" LDFLAGS="-L/usr/lib/oracle/23/client64/lib -lclntsh" R CMD INSTALL ROracle_1.3-1.1.tar.gz
方法2:修改ROracle源码(更彻底)
- 解压源码包并进入源码目录:
tar zxvf ROracle_1.3-1.1.tar.gz cd ROracle/src
- 编辑
rodbi.h文件,找到RODBI_ERROR宏的定义(约217行):
原宏定义:
#define RODBI_ERROR(err) \ error(err)
修改为:
#define RODBI_ERROR(err) \ error("%s", err)
通过%s占位符传递变量,符合format-security的规则。
3. 返回源码根目录重新安装:
cd .. R CMD INSTALL .
方法3:尝试预编译二进制包
如果Oracle官方或CRAN提供了适配RHEL8+R4.4.1的预编译ROracle包,可直接下载安装,跳过源码编译步骤。
内容的提问来源于stack exchange,提问作者Nikolai
相关产品推荐
相关产品推荐

