0

我正在尝试在 RInside 包的标准示例存储库中编译示例。我已经尝试运行已经在存储库中的 Makefile,但没有用。到目前为止,我遇到了几个错误,其中一些已经解决了。问题是,每次我解决一个错误时,都会发生两件事之一,它会出现一个新的错误或一个旧的错误再次出现。这是具有相应错误的不同生成文件的代码:

1) 没有 -L 的 Makefile

    all:
        g++ -I/usr/share/R/include -I/home/manuel/R/x86_64-pc-linux-gnu-library/3.4/Rcpp/include -I/home/manuel/R/x86_64-pc-linux-gnu-library/3.4/RInside/include rinsidetest.cpp

正如预期的那样,对这个文件应用 make 会返回关于未定义的 RInside::'s 引用的错误

undefined reference to `RInside::RInside(int, char const* const*, bool, bool, bool)'

2) 带有 -L 链接的 Makefile

all:
g++ -I/usr/share/R/include -I/home/manuel/R/x86_64-pc-linux-gnu-library/3.4/Rcpp/include -I/home/manuel/R/x86_64-pc-linux-gnu-library/3.4/RInside/include -L/usr/lib/R/site-library/RInside/lib -L/home/manuel/R/x86_64-pc-linux-gnu-library/3.4/Rcpp/libs -lRInside -lRcpp -L/usr/lib/R/lib -lR -Wl,-rpath,/home/manuel/R/x86_64-pc-linux-gnu-library/3.4/Rcpp/libs -lRInside -Wl,-rpath,/home/manuel/R/x86_64-pc-linux-gnu-library/3.4/RInside/lib rinsidetest.cpp

错误是这样的:

/usr/bin/ld: cannot find -lRcpp

原来libs库中的.so文件被命名为Rcpp.so,所以我把它重命名为libRcpp.so,错误就消失了。

3)在重命名后Rcpp.solibRcpp.so我将 make 应用到第 2 点的相同 makefile)并且错误再次与未定义的 RInside::: 引用有关

rinsidetest.cpp:(.text+0x100): undefined reference to `RInside::RInside(int, char const* const*, bool, bool, bool)

4)将make应用于文件夹中已经存在的makefile

make -f Makefile

错误(更改R_LIBS_USER

R_LIBS_USER :=      "/home/manuel/R/x86_64-pc-linux-gnu-library/3.4"

曾是:

fatal error: RInside.h: No such file or directory 
compilation terminated.

到目前为止,我已经阅读了有关在 C++ 中包含标头的更多一般问题,以及一些专门关于 RInside 的问题,其中一些问题由编写包的 Dirk Eddelbuettel 回答,但所有答案都与使用-L<path>/include我几乎可以肯定我使用正确的链接器。

这是我到目前为止读到的一些问题:

在 Linux 上使用 g++编译 RInside 程序 在 Linux 上使用 g++ 编译 RInside 程序

编译 Rcpp 包

http://lists.r-forge.r-project.org/pipermail/rcpp-devel/2012-May/003829.html

http://rcpp-devel.r-forge.r-project.narkive.com/A70U2nVw/problem-with-rinside-hello-world-example

我正在使用带有 R 版本 3.4.4 的 Ubuntu 16.04。任何帮助将不胜感激!

4

1 回答 1

1

我不确定你在哪里迷路了,但基本的想法就是这样说:

  1. 切换到目录。
  2. make clean以防万一。
  3. make(即make all)或只有一个。

这仍然有效——我自己使用 Debian/Ubuntu。

这是make rinside_sample0为了证明这一点,然后运行它:

edd@rob:~$ cd git/rinside/inst/examples/standard/
edd@rob:~/git/rinside/inst/examples/standard$ make -f GNUmakefile clean
rm -vf rinside_sample9 [....stuff remove to keep it shorter...]  rinside_sample16
rm -vrf *.dSYM
edd@rob:~/git/rinside/inst/examples/standard$ make -f GNUmakefile rinside_sample0
ccache g++ -I/usr/share/R/include -I/usr/local/lib/R/site-library/Rcpp/include \
           -I/usr/local/lib/R/site-library/RInside/include -g -O3 -Wall -pipe \
           -Wno-misleading-indentation -Wno-unused \
           -Wno-ignored-attributes -Wno-deprecated-declarations \
           -march=native -Wall  rinside_sample0.cpp  -Wl,--export-dynamic \
           -fopenmp -Wl,-Bsymbolic-functions -Wl,-z,relro -L/usr/lib/R/lib -lR \
           -lpcre -llzma -lbz2 -lz -lrt -ldl -lm -licuuc -licui18n \
           -lblas -llapack  -L/usr/local/lib/R/site-library/RInside/lib \
           -lRInside -Wl,-rpath,/usr/local/lib/R/site-library/RInside/lib \
           -o rinside_sample0
edd@rob:~/git/rinside/inst/examples/standard$ ./rinside_sample0 s
Hello, world!
edd@rob:~/git/rinside/inst/examples/standard(master)$ 

我手动缩进了这个,我可能会在~/.R/Makevars这里显示一些本地设置——这没关系。

重要的是,如果您不理会它,它开箱即用。如果您更改了设置并且它中断了,您就可以解决一个您一开始就不必创建的问题。

于 2018-04-24T18:21:28.130 回答