R语言对接CPLEX编译报错:CPXSIZE_BITS_TEST1数组大小为负
解决Rcplex编译报错:CPXSIZE与size_t类型宽度不匹配
问题背景
用R编写优化问题,计划通过CPLEX 12.6.3求解。CRAN上的Rcplex仅提供源码包,需编译安装;尝试cplexAPI包时,因R版本不兼容无法安装。已完成以下操作:
- 将R升级至4.2.3,安装Rtools 4.3,并在
.Renviron中配置PATH、CPLEX_STUDIO_DIR、CPLEX_STUDIO_LIB环境变量 - CPLEX安装路径为
C:\Program Files\IBM\ILOG\CPLEX_Studio1210(但编译时实际调用的是12.6.3的头文件,路径存在混淆) - 下载
Rcplex_0.3-6.tar.gz源码,修改src/Makevars.win路径后重新打包,执行R CMD check Rcplex时安装失败。
报错详情
检查阶段错误日志
Check Error: C:\Users\Administrator\Desktop>R CMD check Rcplex * using log directory 'C:/Users/Administrator/Desktop/Rcplex.Rcheck' * using R version 4.2.3 (2023-03-15 ucrt) * using platform: x86_64-w64-mingw32 (64-bit) * using session charset: UTF-8 * checking for file 'Rcplex/DESCRIPTION' ... OK * this is package 'Rcplex' version '0.3-6' * checking package namespace information ... OK * checking package dependencies ... OK * checking if this is a source package ... OK * checking if there is a namespace ... OK * checking for executable files ... OK * checking for hidden files and directories ... OK * checking for portable file names ... OK * **checking whether package 'Rcplex' can be installed ... ERROR Installation failed.** See 'C:/Users/Administrator/Desktop/Rcplex.Rcheck/00install.out' for details. * DONE Status: 1 ERROR See 'C:/Users/Administrator/Desktop/Rcplex.Rcheck/00check.log' for details.
编译阶段错误日志
* installing *source* package 'Rcplex' ... ** using staged installation ** libs "D:/software/rtools43/x86_64-w64-mingw32.static.posix/bin/"gcc -I"D:/software/R-4.2.3/include" -DNDEBUG -g -D_R_=1 -DUSE_R=1 -I"D:/Program Files/IBM/ILOG/CPLEX_Studio1263/cplex/include" -DBUILD_CPXSTATIC -I"D:/software/rtools43/x86_64-w64-mingw32.static.posix/include" -O2 -Wall -std=gnu99 -mfpmath=sse -msse2 -mstackrealign -c Rcplex.c -o Rcplex.o In file included from D:/Program Files/IBM/ILOG/CPLEX_Studio1263/cplex/include/ilcplex/cplex.h:17, from Rcplex.h:4, from Rcplex.c:2: D:/Program Files/IBM/ILOG/CPLEX_Studio1263/cplex/include/ilcplex/cpxconst.h:189:13: error: size of array 'CPXSIZE_BITS_TEST1' is negative 189 | typedef int CPXSIZE_BITS_TEST1[1 + (int)sizeof(CPXSIZE) - (int)sizeof(size_t)]; | ^~~~~~~~~~~~~~~~~~ make: *** [D:/software/R-4.2.3/etc/x64/Makeconf:255: Rcplex.o] Error 1 ERROR: compilation failed for package 'Rcplex' * removing 'C:/Users/Administrator/Documents/Rcplex.Rcheck/Rcplex'
报错来源代码(CPLEX头文件cpxconst.h)
/* Make sure that CPXSIZE is exactly as wide as size_t. The test * below is a compile time test that works unless sizeof(CPXSIZE) * and sizeof(size_t) differ by exactly 1. If the sizes differ by * more than 1 then at least one of the typedefs below defines an * array of negative length. This should be caught by the compiler. */ #ifndef CPXSIZE_BITS_TEST_DISABLE typedef int CPXSIZE_BITS_TEST1[1 + (int)sizeof(CPXSIZE) - (int)sizeof(size_t)]; typedef int CPXSIZE_BITS_TEST2[1 + (int)sizeof(size_t) - (int)sizeof(CPXSIZE)]; #endif /* !CPXSIZE_BITS_TEST_DISABLE */ #endif /* !CPX_INTWIDTH_H */
解决方法
方法1:禁用CPXSIZE宽度检查
编译时添加宏定义跳过CPLEX的类型宽度校验:
- 打开解压后的Rcplex源码目录,进入
src文件夹,编辑Makevars.win - 找到
PKG_CPPFLAGS行,在末尾追加-DCPXSIZE_BITS_TEST_DISABLE,修改后类似:PKG_CPPFLAGS = -I"$(CPLEX_STUDIO_DIR)/cplex/include" -DBUILD_CPXSTATIC -DCPXSIZE_BITS_TEST_DISABLE - 重新执行打包和安装命令:
R CMD build --no-build-vignettes --no-manual --md5 Rcplex R CMD INSTALL Rcplex_0.3-6.tar.gz
方法2:修正CPLEX路径与版本匹配
当前操作中存在CPLEX版本路径混淆(安装了12.10但编译调用12.6.3的头文件),需统一版本:
- 确认实际使用的CPLEX版本是12.6.3,将
.Renviron中的CPLEX_STUDIO_DIR修改为:CPLEX_STUDIO_DIR="C:/Program Files/IBM/ILOG/CPLEX_Studio1263" - 同步修改
Makevars.win中的CPLEX路径,确保与实际安装路径一致 - 重新打包安装
方法3:匹配编译架构
确保所有工具均为64位:
- 确认R是64位版本(打开R,查看控制台开头的
platform信息为x86_64-w64-mingw32) - 确认Rtools 4.3安装的是64位版本
- 确认CPLEX 12.6.3是64位版本,安装路径对应64位目录
内容的提问来源于stack exchange,提问作者Yun Cai
相关产品推荐
相关产品推荐

