Я пытаюсь заставить мой пакет R пройти новые ограничения в проверке CMD R. Я не могу сделать это, хотя я создал код c под src, который должен сделать регистрацию вызовов
я использовал package_native_routine_registration_skeleton(".")
создать RGraphM_init.cpp (я использовал cpp, потому что у меня есть подстановка в Makevars.win)
Это RGraphM_init.cpp
#include <R.h>
#include <Rinternals.h>
#include <stdlib.h> // for NULL
#include <R_ext/Rdynload.h>/* .Call calls */
extern SEXP RGraphM_run_graph_match(SEXP, SEXP, SEXP);
static const R_CallMethodDef CallEntries[] = {
{"RGraphM_run_graph_match", (DL_FUNC) &RGraphM_run_graph_match, 3},
{NULL, NULL, 0}
};
void R_init_RGraphM(DllInfo *dll)
{
R_registerRoutines(dll, NULL, CallEntries, NULL, NULL);
R_useDynamicSymbols(dll, FALSE);
}
я использовал
useDynLib(packagename, .registration=TRUE)
в именном пространстве
Я предполагал, что .cpp, включающий функции регистрации, будет подхвачен сборкой SHLIB, но это не исправило ПРИМЕЧАНИЕ, что не было вызовов R_useDynamicSymbols и R_regiterRoutines
Отрывок файла Makevars.win, который имеет отношение к делу:
SOURCES= graphmatch_rcpp.cpp RcppExports.cpp RGraphM_init.cpp
OBJECTS= $(SOURCES:.cpp=.o) $(GRAPHM_OBJ_REL)
$(SHLIB): $(OBJECTS)
Это дает ошибку связывания, что RGraphM_init имеет неопределенный ref
C:/RBUILD~1/3.4/mingw_32/bin/g++ -shared -s -static-libgcc -o RGraphM.dll tmp.def graphmatch_rcpp.o RcppExports.o RGraphM_init.o ./graphm/./algorithm_ca.o ./graphm/./algorithm_ext.o ./graphm/./algorithm_fsol.o ./graphm/./algorithm_iden.o ./graphm/./algorithm_lp.o ./graphm/./algorithm.o ./graphm/./algorithm_path.o ./graphm/./algorithm_qcv.o ./graphm/./algorithm_rand.o ./graphm/./algorithm_rank.o ./graphm/./algorithm_umeyama.o ./graphm/./algorithm_unif.o ./graphm/./experiment.o ./graphm/./graph.o ./graphm/./hungarian.o ./graphm/./rpc.o -LC:\tools\local\/lib -lgsl -lgslcblas -LC:\tools\local\lib/i386 -lgsl -lgslcblas -Ld:/Compiler/gcc-4.9.3/local330/lib/i386 -Ld:/Compiler/gcc-4.9.3/local330/lib -LC:/PROGRA~1/R/R-34~1.0/bin/i386 -lR
RGraphM_init.o:RGraphM_init.cpp:(.rdata+0x1c): undefined reference to `RGraphM_run_graph_match(SEXPREC*, SEXPREC*, SEXPREC*)'
($ (GRAPHM_OBJ_REL) — это целая куча статических объектов C
Это RcppExports.cpp
// Generated by using Rcpp::compileAttributes() -> do not edit by hand
// Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393
#include <RcppGSL.h>
#include <Rcpp.h>
using namespace Rcpp;
// run_graph_match
Rcpp::List run_graph_match(const RcppGSL::Matrix& A, const RcppGSL::Matrix& B, const Rcpp::List& algorithm_params);
RcppExport SEXP RGraphM_run_graph_match(SEXP ASEXP, SEXP BSEXP, SEXP algorithm_paramsSEXP) {
BEGIN_RCPP
Rcpp::RObject rcpp_result_gen;
Rcpp::RNGScope rcpp_rngScope_gen;
Rcpp::traits::input_parameter< const RcppGSL::Matrix& >::type A(ASEXP);
Rcpp::traits::input_parameter< const RcppGSL::Matrix& >::type B(BSEXP);
Rcpp::traits::input_parameter< const Rcpp::List& >::type algorithm_params(algorithm_paramsSEXP);
rcpp_result_gen = Rcpp::wrap(run_graph_match(A, B, algorithm_params));
return rcpp_result_gen;
END_RCPP
}
и это код run_graph_match
#include <Rcpp.h>
#include <RcppGSL.h>
#include <iostream>
#include <stdlib.h>
#include <cstdlib>
#include <iostream>
#include <stdlib.h>
#include <stdexcept>
#include <gsl/gsl_matrix.h>
#include <gsl/gsl_permutation.h>
#include "graphm/graph.h"#include "graphm/experiment.h"#include "graphm/algorithm.h"
using namespace std;
using namespace Rcpp;
// declare a dependency on the RcppGSL package; also activates plugin
// (but not needed when ’LinkingTo: RcppGSL’ is used with a package)
//
// [[Rcpp::depends(RcppGSL,Rcpp)]]
// [[Rcpp::export]]
Rcpp::List run_graph_match(const RcppGSL::Matrix& A, const RcppGSL::Matrix& B, const Rcpp::List& algorithm_params){
// .. body
}
Задача ещё не решена.
Других решений пока нет …