如何创建独立Rmath.h库在C中调用R函数及相关问题求助
问题解决步骤
问题1:已安装的R 4.1.0目录下无src/nmath/standalone目录
- 常规二进制安装的R发行版仅包含运行时文件,不会自带源码目录,该目录仅存在于R官方发布的源码压缩包中,你已下载源码包的情况可直接使用源码包内的对应目录即可,无需在安装版R路径下寻找。
问题2:编译报错"undefined reference to `dnorm4'"
该报错由多个操作错误共同导致,逐一修正即可:
第一步:先编译生成Rmath独立库
你需要先完成Rmath库本身的编译,再编译自己的测试代码:
- 确保你已安装与R 4.1.0匹配的Rtools40编译环境,并将Rtools的bin路径添加到系统环境变量
- 进入R源码根目录下的
src/nmath/standalone路径,执行如下命令编译Rmath静态库与动态库:
make -f Makefile.win
编译完成后该路径下会生成libRmath.a(静态库)、Rmath.dll(动态库)和libRmath.dll.a(动态库导入库)。
第二步:修正测试代码缺失依赖
你的Interoperate.c中调用了printf但未引入标准输入输出头文件,在开头添加以下代码即可:
#include <stdio.h>
第三步:修正编译命令错误
你原命令存在两个核心错误:
- 添加了
-c参数:该参数表示仅生成目标文件、不执行链接流程,此时你指定的-L、-l链接参数完全不生效 - 链接顺序错误:gcc要求源/目标文件要放在依赖库的前面,否则链接器会无法正确解析符号
修正后的编译命令如下:
gcc -g -o Interoperate.exe Interoperate.c -ID:/R-4.1.0/src/include -LD:/R-4.1.0/src/nmath/standalone/ -lRmath -lm
运行验证
如果是静态链接,直接运行生成的Interoperate.exe即可;如果是动态链接,需要将编译生成的Rmath.dll放到Interoperate.exe同目录下再运行。
内容的提问来源于stack exchange,提问作者Digvijay Singh
相关产品推荐
相关产品推荐

