R: Имя символа C отсутствует в таблице загрузки - ошибка при связывании с внешними файлами .c

Я пытаюсь использовать пакет Rsundials для решения системы обыкновенных дифференциальных уравнений (ОДУ) с использованием СОЛНЕЧНЫЕ ЧАСЫ. Во-первых, я пытаюсь запустить пример в руководстве.

Солнечные часы можно использовать для решения ОДУ, когда правая часть ОДУ описана в файле C.

Во-первых, ODE описаны в файле C (пример программы из пакета)

#include "include/nvector/nvector_serial.h"
#include "include/sundials/sundials_dense.h"
#define Ith(v,i) ( NV_DATA_S(v)[i - 1] )

int rhs(realtype t, N_Vector y, N_Vector ydot, void *f_data){
       realtype y1, y2, y3;
       y1 = Ith(y,1); y2 = Ith(y,2); y3 = Ith(y,3);
       /* Change values of ydot here using Ith(ydot,i) */

       double L = 49.3;
       double a21 = 0.011; double a12 = 0.012;
       double a31 = 0.0039; double a13 = 0.000035;
       double a01 = 0.021; double a02 = 0.016;
       Ith(ydot, 1) = -(a01 + a21 + a31)*y1 + a12*y2 + a13*y3 + L;
       Ith(ydot, 2) = a21*y1 - (a02 + a12)*y2;
       Ith(ydot, 3) = a31*y1 - a13*y3; 
       return(0);
}

сохранен в файле test_rsundials.c. Затем файл компилируется с помощью следующей команды в терминале

R CMD SHLIB ./test_rsundials.c

Файл компилируется без каких-либо сообщений об ошибках, и я вижу, что test_rsundials.so и test_rsundials.o создаются в моем каталоге.

Затем я использую dyn.load для загрузки пакета -

dyn.load("/ .. path .. /test_rsundials.so")

На шаге выше также нет сообщения об ошибке, наконец, я вызываю решатель cvode, используя следующие команды (как показано в руководстве по пакету)

library(Rsundials)
vals  <- cvodes(c(0.0,0.0,0.0), seq(0,400,20),"test_rsundials","rhs",rtol=1e-4,atol=c(1e-8,1e-14,1e-6),verbose=T)

Это вызывает ошибку -

Error in .Call("cvodes", PACKAGE = "Rsundials", as.double(y), as.double(times),  : 
  "cvodes" not available for .Call() for package "Rsundials"

Я также пробовал следующую команду

yvals  <- .Call("cvodes",package="Rsundials",c(0.0,0.0,0.0), seq(0,400,20),"test_rsundials","rhs",rtol=1e-4,atol=c(1e-8,1e-14,1e-6),verbose=T)

что дает мне ошибку

Error in .Call("cvodes", package = "Rsundials", c(0, 0, 0), seq(0, 400,  : 
  C symbol name "cvodes" not in load table

Я не уверен, как я могу обойти это или что это значит. Я вставляю код из cvodes ниже для справки

function (y, times, package, rhs, fndata = NULL, jacfunc = NULL, 
    rootfunc = NULL, numroots = 0, rtol = 1e-06, atol = 1e-06, 
    maxnumsteps = 500, maxstep = 0, verbose = FALSE, lasttime = FALSE) 
{
    if (!is.numeric(y)) 
        stop("Error: 'y' must be numeric")
    if (!is.numeric(times)) 
        stop("Error: 'times' must be numeric")
    if (!is.character(package)) 
        stop("Error: 'package' must be a character vector")
    if (!is.character(rhs)) 
        stop("Error: 'Right Hand Side function must be a character vector")
    if (!is.null(jacfunc) && !is.character(jacfunc)) 
        stop("Error: 'jacfunc' must be a character vector")
    if (!is.null(rootfunc) && !is.character(rootfunc)) 
        stop("Error: 'rootfunc' must be a character vector")
    if (!is.null(rootfunc) && numroots <= 0) 
        stop("Error: numroots must be greater than 0")
    if (!is.numeric(numroots)) 
        stop("Error: 'numroots' must be numeric")
    if (!is.numeric(rtol)) 
        stop("Error: 'rtol' must be numeric")
    if (!is.numeric(atol)) 
        stop("Error: 'atol' must be numeric")
    if (!is.numeric(maxstep)) 
        stop("Error: 'maxsteps' must be numeric")
    if (!is.null(fndata) && !is.numeric(fndata)) 
        stop("Error: Data arguments must be numeric")
    s = 1
    rhs = getNativeSymbolInfo(rhs, PACKAGE = package)$address
    jfunc = NULL
    if (!is.null(jacfunc)) 
        jfunc = getNativeSymbolInfo(jacfunc, PACKAGE = package)$address
    rofunc = NULL
    if (!is.null(rootfunc)) 
        rofunc = getNativeSymbolInfo(rootfunc, PACKAGE = package)$address
    solutions = .Call("cvodes", PACKAGE = "Rsundials", as.double(y), 
        as.double(times), rhs, as.double(fndata), jfunc, rofunc, 
        as.integer(numroots), as.integer(s), as.double(rtol), 
        as.double(atol), as.integer(maxnumsteps), as.integer(maxstep), 
        as.integer(verbose), as.integer(lasttime))
    if (lasttime == TRUE) 
        rows = 1
    else rows = length(times)
    solutions <- matrix(solutions, rows)
    col <- c()
    for (i in 1:length(y)) col[i] <- paste("y", i, sep = "")
    if (lasttime == TRUE) 
        dimnames(solutions) <- list(times[length(times)], col)
    else dimnames(solutions) <- list(times, col)
    solutions
}
<environment: namespace:Rsundials>

Также ниже вставлены подробности о моем R

> version
               _                           
platform       x86_64-apple-darwin13.1.0   
arch           x86_64                      
os             darwin13.1.0                
system         x86_64, darwin13.1.0        
status                                     
major          3                           
minor          1.0                         
year           2014                        
month          04                          
day            10                          
svn rev        65387                       
language       R                           
version.string R version 3.1.0 (2014-04-10)
nickname       Spring Dance     

Я читал, что это может быть проблема с 64-битной и 32-битной компиляцией, я не уверен, как я могу указать компиляцию с 64-битным флагом. Я новичок в R и C, поэтому любая помощь будет высоко оценена!

Публикация обновления. Я читал, что эта ошибка может быть связана с проблемами связывания с библиотекой. Я посмотрел папку src этого пакета, и там есть файл Makevars.old что означает, что мне может понадобиться связать с библиотеками

PKG_CFLAGS=-w

PKG_LIBS=-L. -lsundials_cvodes -lsundials_ida -lsundials_fida -lsundials_nvecserial

ПРИМЕЧАНИЕ. В руководстве к пакету сказано, что «Установка СОЛНЕЧНЫХ ЧАСОВ не является обязательным условием для пакета». Поэтому я поместил все файлы из папки src этого пакета в папку моего проекта (надеюсь, там нет файл не найден ошибки).

Теперь я попытался скомпилировать следующие команды в терминале

export PKG_CFLAGS="-w"    
export PKG_LIBS="-L. -lsundials_cvodes -lsundials_nvecserial"
R CMD SHLIB test_rsundials.c sundials_dense.c nvector_serial.c 

Я получаю следующую ошибку сейчас

clang -I/Library/Frameworks/R.framework/Resources/include -DNDEBUG  -I/usr/local/include -I/usr/local/include/freetype2 -I/opt/X11/include   -w -fPIC  -Wall -mtune=core2 -g -O2  -c nvector_serial.c -o nvector_serial.o
clang -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -multiply_defined suppress -L/usr/local/lib -o nvector_serial.so nvector_serial.o sundials_dense.o test_rsundials.o -L. -lsundials_cvodes -F/Library/Frameworks/R.framework/.. -framework R -Wl,-framework -Wl,CoreFoundation
ld: library not found for -lsundials_cvodes
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [nvector_serial.so] Error 1

Хотя я вижу, что создаются три новых файла .o (test_rsundials.o, nvector_serial.o и sundials_dense.o).

Любая помощь будет высоко ценится!!


person Satya    schedule 04.04.2015    source источник
comment
Прочтите руководство для cvodes в руководстве Rsundials. Особенно аргумент package. Вам нужно dyn.load позвонить test_rsundials.so, прежде чем звонить cvodes.   -  person Bhas    schedule 04.04.2015
comment
Спасибо за комментарий, делаю dyn.load после компиляции, забыл добавить в пост. Теперь я отредактировал сообщение, чтобы отразить это.   -  person Satya    schedule 04.04.2015
comment
Я бы настоятельно рекомендовал вам создать ссылку на сборку пакета для внешней библиотеки. Многие пакеты делают это с помощью Rcpp, поэтому у вас будет большое количество рабочих примеров для изучения.   -  person Dirk Eddelbuettel    schedule 05.04.2015
comment
@DirkEddelbuettel - Спасибо за ваш комментарий. Из-за моих ограниченных навыков R и C я не могу понять ваш комментарий относительно создания пакета для внешней библиотеки. Я прямо сейчас просто пытаюсь использовать Rsundials для решения системы ОДУ. Тем не менее, само руководство было менее чем полезным, в примере программы в формате PDF были ошибки, поэтому мне пришлось выкапывать рабочий файл C из исходного кода. Даже после этого я не могу получить рабочий пример. Я опубликовал обновление (выше) относительно привязки к библиотеке СОЛНЕЧНЫХ ЧАСОВ при использовании R CMD SHLIB, не могли бы вы взглянуть? Спасибо!   -  person Satya    schedule 05.04.2015
comment
Я не думаю, что вы можете решить проблему. Пакет не обслуживался с 2012 года. Он использует функции, которые игнорируются. Вы должны отправить электронное письмо автору.   -  person Bhas    schedule 05.04.2015
comment
Спасибо. Я написала автору, жду сейчас ответа автора, но особо не надеюсь.   -  person Satya    schedule 05.04.2015
comment
Я еще раз просмотрел исходный код пакета. ему нужен правильный и правильный файл NAMESPACE. Все сообщения об ошибках, которые вы получили, соответствуют ожиданиям.   -  person Bhas    schedule 05.04.2015
comment
@SN248. Вы получили ответ от автора?   -  person Bhas    schedule 22.04.2015
comment
Нет, ответа от автора я не получил.   -  person Satya    schedule 22.04.2015
comment
Я отправил письмо в CRAN об этом пакете. Мне сказали связаться с сопровождающим, и если я не получу ответ, снова связаться с CRAN. Я также свяжусь с автором и посмотрю, что произойдет. В случае отсутствия ответа в течение разумного периода времени я снова свяжусь с CRAN, чтобы они могли удалить пакет, заархивировать его и, возможно, осиротеть. Я дам вам знать, что происходит.   -  person Bhas    schedule 22.04.2015