安装R库:未定义的符号 我有一个工作C++库,我想通过Rcpp把函数暴露给R,我有以下目录设置< /p> ├── CMakeLists.txt ├── DESCRIPTION ├── install_log.txt ├── LICENSE ├── mock_data.csv ├── NAMESPACE ├── R │   └── RcppExports.R ├── README.md ├── scripts │   ├── generate_synthetic_data.cpp │   └── run_synthetic.cpp ├── src │   ├── collectors │   │   ├── base_collector.hpp │   │   ├── file_collector.cpp │   │   └── file_collector.hpp │   ├── data │   │   ├── cluster.hpp │   │   ├── time_series.cpp │   │   ├── time_series.hpp │   ├── data.hpp │   ├── exponential_family │   │   ├── mv_normal_inv_wishart.hpp │   │   ├── mv_normal_inv_wishart_imp.hpp │   │   ├── mv_normal_wishart.cpp │   │   ├── mv_normal_wishart.hpp │   │   └── options.hpp │   ├── linear_model │   │   ├── mv_fixed_covariance.cpp │   │   └── mv_fixed_covariance.hpp │   ├── Makevars │   ├── models │   │   ├── ar_model.cpp │   │   ├── ar_model.hpp │   │   └── base_model.hpp │   ├── random │   │   ├── inv_wishart.hpp │   │   ├── mvn.hpp │   │   ├── mvn_precision.hpp │   │   ├── polya_gamma │   │   │   ├── PolyaGamma.cpp │   │   │   ├── PolyaGamma.h │   │   │   └── RNG │   │   │   ├── CPURNG.cpp │   │   │   ├── CPURNG.hpp │   │   └── wishart.hpp │   ├── RcppExports.cpp │   ├── RcppExports.o │   ├── rcpp_functions.cpp │   ├── rcpp_functions.h │   ├── samplers │   │   ├── beta_sampler.cpp │   │   ├── beta_sampler.hpp │   │   ├── gamma_sampler.cpp │   │   ├── gamma_sampler.hpp │   │   ├── g_sampler.cpp │   │   ├── g_sampler.hpp │   │   ├── phi_sampler.cpp │   │   ├── phi_sampler.hpp │   │   ├── sigma_sampler.cpp │   │   ├── sigma_sampler.hpp │   │   ├── weights_sampler.cpp │   │   └── weights_sampler.hpp │   └── utils │   ├── argparse.hpp │   ├── data_utils.cpp │   ├── data_utils.hpp │   ├── math_utils.cpp │   ├── math_utils.hpp │   ├── string_utils.cpp │   ├── string_utils.hpp │   ├── vector_utils.cpp │   └── vector_utils.hpp ├── test │   ├── test_ar_model.cpp │   ├── test_vector_utils.cpp │   └── test_wishart.cpp └── MyPackage_1.0.tar.gz

安装R库:未定义的符号 我有一个工作C++库,我想通过Rcpp把函数暴露给R,我有以下目录设置< /p> ├── CMakeLists.txt ├── DESCRIPTION ├── install_log.txt ├── LICENSE ├── mock_data.csv ├── NAMESPACE ├── R │   └── RcppExports.R ├── README.md ├── scripts │   ├── generate_synthetic_data.cpp │   └── run_synthetic.cpp ├── src │   ├── collectors │   │   ├── base_collector.hpp │   │   ├── file_collector.cpp │   │   └── file_collector.hpp │   ├── data │   │   ├── cluster.hpp │   │   ├── time_series.cpp │   │   ├── time_series.hpp │   ├── data.hpp │   ├── exponential_family │   │   ├── mv_normal_inv_wishart.hpp │   │   ├── mv_normal_inv_wishart_imp.hpp │   │   ├── mv_normal_wishart.cpp │   │   ├── mv_normal_wishart.hpp │   │   └── options.hpp │   ├── linear_model │   │   ├── mv_fixed_covariance.cpp │   │   └── mv_fixed_covariance.hpp │   ├── Makevars │   ├── models │   │   ├── ar_model.cpp │   │   ├── ar_model.hpp │   │   └── base_model.hpp │   ├── random │   │   ├── inv_wishart.hpp │   │   ├── mvn.hpp │   │   ├── mvn_precision.hpp │   │   ├── polya_gamma │   │   │   ├── PolyaGamma.cpp │   │   │   ├── PolyaGamma.h │   │   │   └── RNG │   │   │   ├── CPURNG.cpp │   │   │   ├── CPURNG.hpp │   │   └── wishart.hpp │   ├── RcppExports.cpp │   ├── RcppExports.o │   ├── rcpp_functions.cpp │   ├── rcpp_functions.h │   ├── samplers │   │   ├── beta_sampler.cpp │   │   ├── beta_sampler.hpp │   │   ├── gamma_sampler.cpp │   │   ├── gamma_sampler.hpp │   │   ├── g_sampler.cpp │   │   ├── g_sampler.hpp │   │   ├── phi_sampler.cpp │   │   ├── phi_sampler.hpp │   │   ├── sigma_sampler.cpp │   │   ├── sigma_sampler.hpp │   │   ├── weights_sampler.cpp │   │   └── weights_sampler.hpp │   └── utils │   ├── argparse.hpp │   ├── data_utils.cpp │   ├── data_utils.hpp │   ├── math_utils.cpp │   ├── math_utils.hpp │   ├── string_utils.cpp │   ├── string_utils.hpp │   ├── vector_utils.cpp │   └── vector_utils.hpp ├── test │   ├── test_ar_model.cpp │   ├── test_vector_utils.cpp │   └── test_wishart.cpp └── MyPackage_1.0.tar.gz,c++,r,linker-errors,rcpp,dynamic-linking,C++,R,Linker Errors,Rcpp,Dynamic Linking,我试图公开的函数在src/rcpp_functions.h中声明,并在src/rcpp_functions.cpp中定义,它看起来像: #include <RcppEigen.h> #include <vector> #include <vector_utils.hpp> #include <time_series.hpp> #include <ar_model.hpp> using Eigen::MatrixXd; using Ei

我试图公开的函数在src/rcpp_functions.h中声明,并在src/rcpp_functions.cpp中定义,它看起来像:

#include <RcppEigen.h>
#include <vector>
#include <vector_utils.hpp>
#include <time_series.hpp>
#include <ar_model.hpp>

using Eigen::MatrixXd;
using Eigen::VectorXd;
using std::vector;

Rcpp::NumericVector predictiveLogLikelihood(
    const Rcpp::List &timeSerie, const Eigen::MatrixXd &bChain,
    const Eigen::MatrixXd &gammaChain, const Rcpp::List &alphaChains,
    const Rcpp::List &phiChains, const Eigen::MatrixXd &sigmaChain) {

  convert from R to C++ objects & do some stuff
}
目前我认为它已经足够好了,因为我并不需要分发这个包(尽管我非常欢迎关于如何改进它的建议)

当我从终端运行时:

R-e“库(devtools);安装()

编译很好,但我得到以下错误:

*** installing help indices
** building package indices
** testing if installed package can be loaded
Error: package or namespace load failed for ‘MyPackage’ in dyn.load(file, DLLpath = DLLpath, ...):
 unable to load shared object '/home/mario/R/x86_64-pc-linux-gnu-library/3.5/MyPackage/libs/MyPackage.so':
  /home/mario/R/x86_64-pc-linux-gnu-library/3.5/MyPackage/libs/MyPackage.so:
 undefined symbol: _Z23predictiveLogLikelihoodRKN4Rcpp6VectorILi19ENS_15PreserveStorageEEERK
给定符号的名称,我猜它指的是Rcpp函数(我没有任何其他PredictiveLoglikelion函数)

我可能错过了一些非常明显的东西,但我已经在这个问题上坚持了几天,查看了所有Rcpp包和包RCPPE示例

编辑1 编译的输出是

>R -e "library(devtools); install()"
....
Running /usr/lib/R/bin/R CMD INSTALL \
ttmp/Rtmp412bar/MyPackage_1.0.tar.gz --install-tests 
* installing to library ‘/home/mario/R/x86_64-pc-linux-gnu-library/3.5’
* installing *source* package ‘MyPackage’ ...
** libs

g++ -std=gnu++14 -I"/usr/share/R/include" -DNDEBUG -I"." -I"./collectors" -I"./data" -I"./exponential_family" -I"./linear_model" -I"./models" -I"./random" -I"./random/polya_gamma" -I"./random/polya_gamma/RNG" -I"./samplers" -I"./utils" -I"./usr/include/eigen3/" -DUSE_R -D"USE_R" -w -z,defs -I"/home/mario/R/x86_64-pc-linux-gnu-library/3.5/Rcpp/include" -I"/home/mario/R/x86_64-pc-linux-gnu-library/3.5/RcppArmadillo/include" -I"/home/mario/R/x86_64-pc-linux-gnu-library/3.5/RcppEigen/include" -I"/home/mario/R/x86_64-pc-linux-gnu-library/3.5/RcppGSL/include"    -fpic  -g -O2 -fdebug-prefix-map=/build/r-base-oUvOgu/r-base-3.5.1=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g -c RcppExports.cpp -o RcppExports.o
(对所有源文件都执行此操作)

构建共享对象

g++ -std=gnu++14 -shared -L/usr/lib/R/lib -Wl,-Bsymbolic-functions -Wl,-z,relro -o MyPackage.so RcppExports.o samplers/weights_sampler.o samplers/sigma_sampler.o samplers/g_sampler.o samplers/gamma_sampler.o samplers/phi_sampler.o samplers/beta_sampler.o exponential_family/mv_normal_wishart.o linear_model/mv_fixed_covariance.o models/ar_model.o utils/string_utils.o utils/math_utils.o utils/vector_utils.o utils/data_utils.o data/generate_synthetic_data.o data/time_series.o collectors/file_collector.o -lgsl -L/usr/lib/R/lib -lR


installing to /home/mario/R/x86_64-pc-linux-gnu-library/3.5/MyPackage/libs
** R
** byte-compile and prepare package for lazy loading
** help
*** installing help indices
** building package indices
** testing if installed package can be loaded
错误


在链接的对象文件列表中,缺少一个文件:
rcpp\u functions.o
。您可以将其添加到
Makevars
文件中的
OBJECTS

OBJECTS = RcppExports.o rcpp_functions.o $(SOURCES:.cpp=.o)
或者你可以使用

SOURCES = $(wildcard *.cpp) $(wildcard **/*.cpp)

OBJECTS = $(SOURCES:.cpp=.o)

在链接的对象文件列表中,缺少一个文件:
rcpp\u functions.o
。您可以将其添加到
Makevars
文件中的
OBJECTS

OBJECTS = RcppExports.o rcpp_functions.o $(SOURCES:.cpp=.o)
或者你可以使用

SOURCES = $(wildcard *.cpp) $(wildcard **/*.cpp)

OBJECTS = $(SOURCES:.cpp=.o)

我觉得奇怪的是,目录列表中只有一个objst文件(
RcppExports.o
)。你能发布包编译输出,特别是链接库的最后一行吗?你正在使用CGube,但是你有一个手写的MaFixFr.@ MatthieuBrucher,这个库作为一个独立的C++库,我使用CMAGE,和一个R包,我使用Makavar Field.OK,然后链接到适当的库或编译适当的文件。另外,如果你必须重新设计R包的构建系统,但它出现了问题,你可以保留这些部分。这是有点过于复杂的尝试中的一个简单错误。我觉得奇怪的是,目录列表中只有一个objst文件(
RcppExports.o
)。你能发布包编译输出,特别是链接库的最后一行吗?你正在使用CGube,但是你有一个手写的MaFixFr.@ MatthieuBrucher,这个库作为一个独立的C++库,我使用CMAGE,和一个R包,我使用Makavar Field.OK,然后链接到适当的库或编译适当的文件。另外,如果你必须重新设计R包的构建系统,但它出现了问题,你可以保留这些部分。这是有点过于复杂的尝试中的一个简单错误。
SOURCES = $(wildcard *.cpp) $(wildcard **/*.cpp)

OBJECTS = $(SOURCES:.cpp=.o)