我如何编译具有多个依赖关系的C函数并从R调用它?



我有一个用C编写的函数,我想从r中编译和调用。它位于ensembleBaggedTreesExtendedStay_V2.c中,这取决于这些额外的文件:

CompactClassificationTree.c
CompactEnsemble.c
ensembleBaggedTreesExtendedStay_V2_data.c
ensembleBaggedTreesExtendedStay_V2_initialize.c
ensembleBaggedTreesExtendedStay_V2_terminate.c
findNode.c
predictOneWithCache.c
rt_nonfinite.c
rtGetInf.c
rtGetNaN.c
updateCache.c

我如何编译这段代码,然后调用函数(声明如下)在一个R进程?

double ensembleBaggedTreesExtendedStay_V2(
double TransferredYesNo,
double BleedDisYesNo,
double PreOpAlbumin,
double PreOpHCT,
double ASAClass,
double ComplexYesNo);

我尝试创建一个连接所有目标文件的共享库,但我无法从r中调用函数。

下面是文件a.c与依赖项b.c的简单示例。当然,根据您的用例,您可以考虑只编写一个包含C源文件的R包,但这超出了问题的范围。

/* a.c */
#include <Rinternals.h>
double add2(double, double);
SEXP R_add2(SEXP x, SEXP y) {
if (LENGTH(x) == 0 || LENGTH(y) == 0)
error("oops");
double *px = REAL(x), *py = REAL(y);
return ScalarReal(add2(px[0], py[0]));
}
/* b.c */
double add2(double x, double y) {
return x + y;
}

那么,在R进程中:

## R CMD COMPILE a.c b.c
tools::Rcmd(c("COMPILE", "a.c", "b.c"))
clang -I"/usr/local/lib/R/include" -DNDEBUG   -I/usr/local/include    -fPIC  -Wall -g -O2 -pedantic -mmacosx-version-min=13.0 -arch arm64 -falign-functions=64 -Wno-error=implicit-function-declaration -flto=thin -c a.c -o a.o
clang -I"/usr/local/lib/R/include" -DNDEBUG   -I/usr/local/include    -fPIC  -Wall -g -O2 -pedantic -mmacosx-version-min=13.0 -arch arm64 -falign-functions=64 -Wno-error=implicit-function-declaration -flto=thin -c b.c -o b.o
## R CMD SHLIB -o ab.so a.o b.o
tools::Rcmd(c("SHLIB", "-o", "ab.so", "a.o", "b.o"))
clang -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -multiply_defined suppress -Wall -g -O2 -pedantic -mmacosx-version-min=13.0 -arch arm64 -falign-functions=64 -Wno-error=implicit-function-declaration -flto=thin -fPIC -Wl,-mllvm,-threads=4 -L/usr/local/lib/R/lib -L/usr/local/lib -o ab.so a.o b.o -L/usr/local/lib/R/lib -lR -Wl,-framework -Wl,CoreFoundation
dyn.load("ab.so")
.Call("R_add2", 1, 2)
[1] 3

相关内容

  • 没有找到相关文章

最新更新