当我在C ++程序中包含RInside头时,如何让链接器工作?

时间:2018-04-24 18:08:14

标签: c++ linker include rcpp rinside

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

1)Makefile没有-L

    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.so重命名为libRcpp.so后,我对第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我几乎可以肯定我正确使用它。

这是我直到现在才读到的一些问题:

Compiling RInside program with g++ on Linux Compiling RInside program with g++ on Linux

Compiling the Rcpp package

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

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

1 个答案:

答案 0 :(得分:1)

我不确定你丢失的地方,但基本的想法就是这样说:

  1. 转到目录。
  2. make clean以防万一。
  3. makemake all)或仅一个。
  4. 这仍然有效 - 我自己使用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中有一些本地设置显示在这里 - 这无关紧要。

    重要的是,只要不管它就可以开箱即用。如果您更改设置并且它会中断,则可以解决您首先必须创建的问题。