使用C+创建r包+;windows中的dll并确保可移植到linux 在Windows中工作,我创建了一个R包,它链接到C++ DLL作为共享库。这工作正常,在Windows上安装时不会出现问题。但是,当我切换到linux时,找不到so

使用C+创建r包+;windows中的dll并确保可移植到linux 在Windows中工作,我创建了一个R包,它链接到C++ DLL作为共享库。这工作正常,在Windows上安装时不会出现问题。但是,当我切换到linux时,找不到so,r,R,我认为src目录中唯一的文件应该是.cpp文件,对吗 在创建包之前,是否确实需要在该目录中运行SHLIB命令 在我使用的名称空间中: useDynLib(myc.cpp,my.c.function) 在函数调用中: my.r.f <- .Call(my.c.function, a, b) my.r.f我认为你应该使用useDynLib(myc)。。。符号查找在内部完成。 编辑:另一件事是这个对象文件的名称——我认为标准的makefile只是用包名来命名它,所以它应该是useDynLib

我认为src目录中唯一的文件应该是.cpp文件,对吗

在创建包之前,是否确实需要在该目录中运行SHLIB命令

在我使用的名称空间中:

useDynLib(myc.cpp,my.c.function)
在函数调用中:

my.r.f <- .Call(my.c.function, a, b)

my.r.f我认为你应该使用
useDynLib(myc)
。。。符号查找在内部完成。

编辑:另一件事是这个对象文件的名称——我认为标准的makefile只是用包名来命名它,所以它应该是
useDynLib()
。至少它对我总是有效。

在CRAN上有几百个包,它们成功地完成了您试图做的事情——在任何受支持的平台上构建一个包含待编译源代码的包


我非常喜欢的一种策略是使用一个或多个现有包,并查看它们是如何设置的。然后,您可以复制工作配方,具体取决于它如何与您的设置相对应(有或没有命名空间,有或没有libxml等外部库)

我听取了德克的建议,在CRAN上浏览了几个包

一种常见的方法似乎是在名称空间文件中使用mbq建议的useDynLib(包名称)。然后我用电话:

.Call("my.c.function", a, b, package="package_name")
在约书亚建议的R代码中

现在可以在Linux和Windows上安装并正常工作:-)

我想我很快就会转向Rcpp,因为in-R编译和包构建框架工具看起来非常诱人


谢谢大家

不知道你是否能在这里找到答案,我会去r-develop邮件列表:r-devel@r-org如果你得到了答案,你愿意也把它贴在这里吗?这对我和其他写软件包的人来说都很有趣。@Joris唯一的问题是Dirk Eddelbuettel有时会睡觉;-)将
PACKAGE=“my.PACKAGE.name”
添加到每个
.Call
将避免每个函数调用的符号查找。您确定吗?我认为这只是为了避免名称冲突,而R使用一些字典优化查找,这些字典会根据平台怪癖和dyn.load参数进行更新。但我一点也不确定,“符号查找”可能是个错误的短语。我不记得确切的行为,但包括
PACKAGE
参数阻止了查找,从而大大提高了重复调用
.Call
的速度。它可能是
getCallingDLL
getDLLRegisteredRoutines
。@Joshua,如果你这么说的话。。。我很快就会为一个新的软件包做一些基准测试,我也会检查一下。