首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将guile链接到Rcpp

将guile链接到Rcpp
EN

Stack Overflow用户
提问于 2020-12-17 12:25:53
回答 1查看 165关注 0票数 2

我正在尝试将guile链接到Rcpp文件。看起来像编译了一些东西,但是加载时有一个错误:

代码语言:javascript
复制
sourceCpp("test_2.cpp", rebuild = TRUE, showOutput = TRUE)
/usr/lib/R/bin/R CMD SHLIB --preclean -o 'sourceCpp_2.so' 'test_2.cpp' 
g++-10 -I"/usr/share/R/include" -DNDEBUG   -I"/home/matias/R/x86_64-pc-linux-gnu-library/4.0/Rcpp/include" -I"/home/matias/Documentos/Program/R/guile"    -fpic  -O3 -march=native -mtune=native -fPIC -pthread  -I"/usr/include/guile/3.0" -c test_2.cpp -o test_2.o
g++-10 -shared -L/usr/lib/R/lib -lm -ldl -lgmpxx -lgmp -lmpfr -lmpc -lguile-3.0 -lgc -o sourceCpp_2.so test_2.o -L/usr/lib/R/lib -lR
Error in dyn.load("/tmp/Rtmpm2flY8/sourceCpp-x86_64-pc-linux-gnu-1.0.5/sourcecpp_29e2d33505085/sourceCpp_2.so") : 
  unable to load shared object '/tmp/Rtmpm2flY8/sourceCpp-x86_64-pc-linux-gnu-1.0.5/sourcecpp_29e2d33505085/sourceCpp_2.so':
  /tmp/Rtmpm2flY8/sourceCpp-x86_64-pc-linux-gnu-1.0.5/sourcecpp_29e2d33505085/sourceCpp_2.so: undefined symbol: scm_init_guile

如果我移除Rcpp头并直接使用g++构建,则链接可以正常工作。

我的Makevars看起来是这样的:

代码语言:javascript
复制
CXX = g++-10
CXXFLAGS = -O3 -march=native -mtune=native -fPIC -pthread  -I"/usr/include/guile/3.0"
CXXSTD = -std=c++11
LDFLAGS =  -lm -ldl -lgmpxx -lgmp -lmpfr -lmpc -lguile-3.0 -lgc

.cpp文件:

代码语言:javascript
复制
#include <Rcpp.h>
#include <stdio.h>
#include <libguile.h>

using namespace Rcpp;

// [[Rcpp::export]]
int test_guile() {
    SCM func, func2;
    scm_init_guile();

    scm_c_primitive_load("script.scm");

    func = scm_variable_ref(scm_c_lookup("simple-func"));
    func2 = scm_variable_ref(scm_c_lookup("quick-test"));

    scm_call_0(func);
    scm_call_0(func2);

    return 0;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-17 17:09:17

你是如此,如此亲密。你基本上解决了这个问题。我只是拿了你的文件,做了一个小小的修改,让脚本成为一个参数,并且(因为你没有发布script.scm)注释掉了内容特定的内容。不过,我们仍然加载它:

代码语言:javascript
复制
#include <Rcpp.h>
#include <stdio.h>
#include <libguile.h>

using namespace Rcpp;

// [[Rcpp::export]]
int test_guile(std::string file) {
    SCM func, func2;
    scm_init_guile();

    scm_c_primitive_load(file.c_str());

    //func = scm_variable_ref(scm_c_lookup("simple-func"));
    //func2 = scm_variable_ref(scm_c_lookup("quick-test"));

    //scm_call_0(func);
    //scm_call_0(func2);

    return 0;
}

类似地,我只是将一个src/Makevars添加到Rcpp.package.skeleton()创建的文件中。这还不够好,因为您需要一些最小的configure或类似的逻辑才能从guile-config-3.0或alike获得这些值。但它通过了试金石测试。C++11是R4.0.*下的缺省值,编译器是最近出现在我的框中的,所以我们只需要它(删除了一些GMP和我们不需要的相关部件之后):

代码语言:javascript
复制
PKG_CXXFLAGS = -I"/usr/include/guile/3.0"
PKG_LIBS = -lguile-3.0 -lgc

它现在构建、安装和运行都很好:

代码语言:javascript
复制
> file <- system.file("guile", "script.scm", package="RcppGuile")
> RcppGuile::test_guile(file)
[1] 0
> 

作为参考,我提交并推送了整个示例包这里。如果您提供一个指向script.scm的指针,我们也可以添加它。

编辑:几秒钟的谷歌搜索就会导致你可能用过,所以现在我们有了一个可以工作的嵌入式Guile解释器的完整示例:

代码语言:javascript
复制
> library(RcppGuile)
> test_guile(system.file("guile", "script.scm", package="RcppGuile"))
Script called, now I can change this
Adding another function, can modify without recompilation
Called this, without recompiling the C code
[1] 0
> 
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65340724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档