我有一个从libbcd.so
源代码生成的共享库C
。我也有一些接口代码Rinterface.h, Rinterface.cpp
,如下所示:
Rinterface.h:
#pragma once
#include <R.h>
#include <Rcpp.h>
extern "C" {
#include "bcd.h"
}
void call_bcd();
Rinterface.cpp
#include "Rinterface.h"
// [[Rcpp::export]]
void call_bcd() {
mm_problem* pr = mm_problem_alloc();
bcd_vars* vars = bcd_vars_alloc();
bcd(pr, vars);
}
mm_problem_alloc(), bcd_vars_alloc(), bcd(mm_problem*, bcd_vars*)
是libbcd.so
中的所有函数,mm_problem
和bcd_vars
是libbcd.so
中的用户定义类型。
我用Rcpp.package.skeleton("bcd")
创建了一个程序包,将Rinterface文件放在src
文件夹下,并带有以下Makevars
PKG_CPPFLAGS=-I/usr/local/lib/R/site-library/Rcpp/include/ -I/path/to/bcd/headers/
PKG_LIBS=-L/path/to/bcd/library/file -lbcd
R CMD SHLIB Rinterface.cpp
创建接口库R CMD build .
建立打包的tarball>[如果我在编译步骤后尝试使用install.packages("/path/to/bcd_1.0.tar.gz", type = "source")
从源代码安装软件包,则在尝试加载libbcd.so
时出现错误:
** R ** byte-compile and prepare package for lazy loading ** help *** installing help indices ** building package indices ** testing if installed package can be loaded from temporary location Error: package or namespace load failed for ‘bcd’ in dyn.load(file, DLLpath = DLLpath, ...): unable to load shared object '/home/gomfy/R/x86_64-pc-linux-gnu-library/3.6/00LOCK-bcd/00new/bcd/libs/bcd.so': libbcd.so: cannot open shared object file: No such file or directory
基于this post,在我看来,一种解决方法是将
.c
的libbcd.so
源文件重命名为.cpp
,然后将它们放在src
文件夹中。这是正确的吗?
[通常,推荐使用Rcpp来从R
调用第三方共享库的方法是什么?我发现了一个相关的问题here,但没有涉及构建软件包的详细信息。我看过Writing R extensions
vignette("Rcpp-introduction")
,vignette("Rcpp-package")
,但我无法得出明确的结论。因此,在此感谢专家的帮助。谢谢!我有一个从C源代码生成的共享库libbcd.so。我还有一些接口代码Rinterface.h,Rinterface.cpp,如下所示:Rinterface.h:#pragma一旦#include
总之,你不能。