R包集成Gecode库时Configure脚本生成Makefile异常(Rtools44)
我们正在开发一款集成Gecode 6.2约束规划求解器的R包,为简化用户安装流程,计划将Gecode源码内置到包中。已安装Rtools44并通过pacman -S --needed base-devel mingw-w64-x86_64-toolchain配置工具链,手动在mingw64.exe终端中进入Gecode源码目录执行configure和make可成功编译,说明工具链本身正常。
但通过R CMD build构建R包时(使用如下Makevars配置),Gecode的configure能正常执行,但make过程报错:
make[2]: DGECODE_BUILD_SUPPORT: No such file or directory
查看编译命令发现,本该出现在-DGECODE_BUILD_SUPPORT前的$(CXX) $(CXXFLAGS)变量为空,而Gecode configure生成的Makefile原本有默认的CXX=g++和完整的CXXFLAGS配置,推测是R的构建环境重置了这些变量,导致Gecode的make无法获取正确的编译器和参数。
方案1:调用Gecode make时清除R传递的空变量
修改Makevars中的build_gecode目标,使用env -u命令清除R环境传递的空CXX和CXXFLAGS变量,让Gecode的Makefile使用自身生成的默认值:
.PHONY: all GECODE_DIR = $(CURDIR)/gecode-release-6.3.0 PKG_CPPFLAGS = -I$(GECODE_DIR)/gecode PKG_LIBS = -L$(GECODE_DIR) -lgecodesearch -lgecodeminimodel -lgecodeint -lgecodekernel -lgecodesupport CXX_STD = CXX20 CXXFLAGS += -g -O -mtune=native .NOTPARALLEL all: build_gecode $(MAKE) R_package_build build_gecode: cd $(GECODE_DIR) && ./configure CC=gcc CXX=g++ --disable-examples --with-host-os=windows # 清除R传递的空变量,强制使用Gecode Makefile的默认配置 cd $(GECODE_DIR) && env -u CXX -u CXXFLAGS $(MAKE)
方案2:显式传递编译器参数给Gecode的make
如果需要自定义编译参数,可在调用make时直接指定CXX和CXXFLAGS,覆盖R环境的空值:
build_gecode: cd $(GECODE_DIR) && ./configure CC=gcc CXX=g++ --disable-examples --with-host-os=windows cd $(GECODE_DIR) && $(MAKE) CXX=g++ CXXFLAGS="-mthreads -fcx-limited-range -fno-signaling-nans -fno-rounding-math -ffinite-math-only -fno-math-errno -fno-strict-aliasing -O3 -fvisibility=hidden -ggdb -std=c++17 -pipe -Wno-unknown-pragmas -Wall -Wextra -fPIC -DNDEBUG"
方案3:configure阶段锁定编译参数
在Gecode的configure命令中直接指定CXXFLAGS,确保生成的Makefile中变量不会被R环境覆盖:
build_gecode: cd $(GECODE_DIR) && ./configure CC=gcc CXX=g++ CXXFLAGS="-mthreads -fcx-limited-range -fno-signaling-nans -fno-rounding-math -ffinite-math-only -fno-math-errno -fno-strict-aliasing -O3 -fvisibility=hidden -ggdb -std=c++17 -pipe -Wno-unknown-pragmas -Wall -Wextra -fPIC -DNDEBUG" --disable-examples --with-host-os=windows cd $(GECODE_DIR) && $(MAKE)
关于Rtools44 bash找不到g++的补充说明
这是因为Rtools44的bash默认加载32位工具链路径,而你安装的是x86_64版本,可通过以下命令临时添加路径:
export PATH=/c/rtools44/mingw64/bin:$PATH
但该问题并非本次编译失败的根源,核心还是R构建环境对Gecode编译变量的干扰。
内容的提问来源于stack exchange,提问作者Nils Lüschow

