移除CXX_STD=CXX11后Rtools在Windows编译共享对象失败求助
Windows下移除
CXX_STD=CXX11后编译链接错误的解决建议 问题背景
- 为满足CRAN的“incoming feasibility”要求,移除了Makevars文件中的
CXX_STD= CXX11,理论上不影响C++向后兼容性 - Linux环境通过
R CMD check MyPackage.tar.gz检查无问题,macOS通过rhub检查正常 - Windows环境下(包括R 4.3.0开发版+rtools43,以及旧版R搭配rtools42/40),移除该配置后编译共享对象的最后阶段出现gcc无法正确链接标准库的未定义引用错误
- 保留
CXX_STD=CXX11配置时,使用g++可正常编译,但添加CXX=g++到Makevars.win无效果
解决建议
1. 显式指定Windows链接器为g++
在Makevars.win中添加以下配置,强制链接阶段使用g++而非gcc:
SHLIB_LD = g++ SHLIB_LDXX = g++
Windows下R默认可能用gcc处理链接,即便设置了CXX=g++,链接环节仍可能调用gcc,导致C++标准库符号无法被正确识别。直接指定SHLIB_LD和SHLIB_LDXX可以解决这个问题。
2. 在DESCRIPTION中声明C++版本要求
移除Makevars中的CXX_STD=CXX11后,在包的DESCRIPTION文件里添加:
SystemRequirements: C++11
这种方式会让R根据不同平台自动配置对应的C++编译标准,CRAN也认可该声明,既符合兼容性要求,又能让Windows环境自动调用正确的编译器参数。
3. 分平台配置C++标准
主Makevars文件移除CXX_STD=CXX11,仅在Makevars.win中保留该配置:
# Makevars.win CXX_STD = CXX11
CRAN检查时会自动读取对应平台的配置文件,既满足主Makevars的要求,又能保证Windows环境编译正常。
4. 通过configure.win强制编译器链
如果包没有configure.win脚本,新建一个并添加以下内容:
#!/bin/sh export CXX=g++ export SHLIB_LD=g++
R在Windows编译时会自动执行该脚本,强制全程使用g++编译器链。
内容的提问来源于stack exchange,提问作者aldoclemente
相关产品推荐
相关产品推荐

