首页 > 解决方案 > 如何创建独立的 Rmath.h 库来访问 C 中的 R 函数?

问题描述

我在创作中面临困难Rmath.dll。我已经提到了几个来源:

  1. R-exts 6.17:在您自己的 C 代码中使用这些函数
  2. R-admin 9:独立的 Rmath 库
  3. 使用 R 独立数学库

我面临的问题如下:

  1. 我的 R (4.1.0) 安装目录不包含src/nmath/standalone“6.17 在你自己的 C 代码中使用这些函数”中提到的构建库的目录。

  2. 我尝试通过下载和解压缩R-4.1.0.tar文件来构建库,然后按照R-admin中给出的说明进行操作。但是执行如下命令后仍然报错“undefined reference to `dnorm4'” :

    gcc -g -c -o Interoperate.o Interoperate.c -ID:/R-4.1.0/src/include -LD:/R-4.1.0/src/nmath/standalone/  -lRmath -lm
    

Interoperate.c包含以下代码:

#define MATHLIB_STANDALONE
#include <R.h>
#include <Rmath.h>

int main()
{
/*  Inputs  */
    double V1 = 1;
    double V2 = 2;

/*  Normal Distribution  */ 
    double result = dnorm(V1, V2, M_PI, 1);
    printf("%lf\n",result);
    return 0;
}

我现在没有选择了。我需要帮助解决这个问题。

标签: rcwindows

解决方案


您通常会libRmath.a在构建 R 时构建 Rmath 库。每次构建 Debian(和 Ubuntu)软件包时都会这样做,因为我已经按照这种方式进行了设置。现在距离我上次在 Windows 上尝试这个可能已经有几十年了,所以我无法帮助你完成这部分 - 但归根结底,这是一个ar将文件粘合在一起的调用,所以如果你知道如何做到这一点,你可能会能够手工完成。

您的示例在这里运行良好(在 Ubuntu 上):

$ gcc -o answer answer.c -lRmath -I /usr/share/R/include
$ ./answer 
-2.114329
$ 
$ ldd answer
        linux-vdso.so.1 (0x00007ffe3a391000)
        libRmath.so.1 => /usr/lib/libRmath.so.1 (0x00007f12e10b8000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f12e0ece000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f12e0d7f000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f12e0d5d000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f12e111f000)
$ 

推荐阅读