Ошибка: функция недоступна для .Call () для пакета X - PullRequest
3 голосов
/ 27 сентября 2019

Я только начинаю экспериментировать с пакетом Rcpp, поэтому, пожалуйста, будьте терпеливы со мной.

Я прочитал виньетки Rcpp и попробовал несколько приведенных примеров в документации по Rcpp.Теперь я подумал, что начну с обертывания некоторых функций из библиотеки GLFW , библиотеки, написанной на C.

Так что я решил начать с функции glfwInit.Я написал этот простой исходный файл cpp в пакете с именем pixel, чтобы обернуть его под именем glfw_init:

#include <Rcpp.h>
#include <GLFW/glfw3.h>
using namespace Rcpp;


//' @export
// [[Rcpp::export]]
int glfw_init() {

  return(glfwInit());
}

Я работаю в RStudio, используя обычный цикл полоскания и повторения генерации документации и построенияпакет (я использую roxygen2).

Функция экспортируется в R и пространство пользователя, поэтому, если я наберу glfw_init в консоли R, я получу:

function() {
    .Call('_pixel_glfw_init', PACKAGE = 'pixel')
}
<bytecode: 0x5558ece6f398>
<environment: namespace:pixel>

Но еслиЯ пытаюсь запустить его с glfw_init() и получаю сообщение об ошибке:

Error in .Call("_pixel_glfw_init", PACKAGE = "pixel") : 
  "_pixel_glfw_init" not available for .Call() for package "pixel"

Я чувствую, что упускаю некоторые мелкие детали настройки, чтобы это работало ... Любая помощь приветствуется!

PS: Согласно комментарию Конрада, я публикую здесь вывод, который я получаю на панели сборки RStudio:

==> Rcpp::compileAttributes()

* Updated R/RcppExports.R

==> R CMD INSTALL --no-multiarch --with-keep.source pixel

g++ -std=gnu++11 -I"/usr/include/R/" -DNDEBUG  -I"/home/rmagno/R/x86_64-pc-linux-gnu-library/3.6/Rcpp/include" -D_FORTIFY_SOURCE=2  -fpic  -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong -fno-plt  -c glfw.cpp -o glfw.o
* installing to library ‘/home/rmagno/R/x86_64-pc-linux-gnu-library/3.6’
* installing *source* package ‘pixel’ ...
** using staged installation
** libs
g++ -std=gnu++11 -shared -L/usr/lib64/R/lib -Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now -o pixel.so RcppExports.o glfw.o -L/usr/lib64/R/lib -lR
installing to /home/rmagno/R/x86_64-pc-linux-gnu-library/3.6/00LOCK-pixel/00new/pixel/libs
** 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
** checking absolute paths in shared objects and dynamic libraries
** testing if installed package can be loaded from final location
** testing if installed package keeps a record of temporary installation path
* DONE (pixel)

PS2: Вот мое NAMESPACE:

# Generated by roxygen2: do not edit by hand

export(coords_rectangle)
export(coords_rectangular_lattice)
export(coords_segment)
export(coords_square)
export(display_matrix_int)
export(glfw_init)
export(lgl_matrix_to_coords_grid_segment)
export(lgl_matrix_to_coords_segment)
export(palette_for_quads)

PS3: После созданияновый файл R/pixel.R:

#' @useDynLib pixel, .registration = TRUE
#' @importFrom Rcpp sourceCpp
NULL

Теперь я получаю эту ошибку при попытке сгенерировать документацию:

==> Rcpp::compileAttributes()

* Updated R/RcppExports.R

==> devtools::document(roclets = c('rd', 'collate', 'namespace'))

Updating pixel documentation
Loading pixel
Error in dyn.load(dllfile) : 
  unable to load shared object '/home/rmagno/sci/code/R/pkg/pixel/src/pixel.so':
  /home/rmagno/sci/code/R/pkg/pixel/src/pixel.so: undefined symbol: glfwInit
Calls: suppressPackageStartupMessages ... <Anonymous> -> load_dll -> library.dynam2 -> dyn.load
Execution halted

Exited with status 1.

1 Ответ

3 голосов
/ 27 сентября 2019

Новая ошибка означает, что вы не связали код C ++ с библиотекой GLFW.Вам необходимо предоставить файл src/Makevars, который добавит библиотеку к PKG_LIBS.См. Использование Makevars в руководстве Writing R Extensions .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...