Я пытаюсь связать хитрость с файлом Rcpp. Вроде все компилируется, но при загрузке вылетает ошибка:
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 выглядят так:
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:
#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;
}





Ты так, так близко. Вы, по сути, решили это. Я просто взял ваш файл, сделал небольшую модификацию, сделав скрипт аргументом, и (поскольку вы не опубликовали script.scm) закомментировал специфические для контента вещи. Мы все еще загружаем его, хотя:
#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 или аналогичной. Но он проходит лакмусовую бумажку. C++11 используется по умолчанию уже в R 4.0.*, и в любом случае компилятор недавно появился на моем компьютере, поэтому у нас есть только это (после удаления нескольких GNU GMP и связанных с ними частей, которые нам не нужны):
PKG_CXXFLAGS = -I"/usr/include/guile/3.0"
PKG_LIBS = -lguile-3.0 -lgc
Теперь это строится, устанавливается и работает нормально:
> file <- system.file("guile", "script.scm", package = "RcppGuile")
> RcppGuile::test_guile(file)
[1] 0
>
Для справки, я зафиксировал и отправил весь пример пакета сюда. Если вы предоставите указатель на script.scm, мы можем добавить и это.
Редактировать: несколько секунд гугления приводят к script.scm, который вы, возможно, использовали, так что теперь у нас есть полностью рабочий пример с работающим встроенным интерпретатором Guile:
> 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
>
Это был действительно хороший вопрос. Я написал ответ в виде короткого поста в галерее Rcpp здесь: Gallery.rcpp.org/articles/guile-via-rcpp