将Rcpp链接到interp2d(GSL类型库)

时间:2014-01-13 15:15:31

标签: rcpp gsl

我需要一些帮助来解决在我没有管理员权限的Linux系统上安装Rcpp软件包时遇到的链接器错误。简而言之,我收到了这个错误:

  在制作共享对象时,不能使用<。>对`.rodata'重定位R_X86_64_32;用-fPIC重新编译

我有一个使用外部库interp2d的文件solve.cpp,后者又具有GSL依赖性。我通过[[Rcpp::depends(RcppArmadillo,RcppGSL)]]DESCRIPTION指定了我的依赖项。我的Makevars就像是RcppGSL包中的那个,添加了linterp2d标志:

PKG_CPPFLAGS = -W $(GSL_CFLAGS) $(LOCAL_INCLUDE)
PKG_LIBS += $(GSL_LIBS) $(LOCAL_LIBS) -linterp2d $(RCPP_LDFLAGS) 

我定义了环境变量

export LOCAL_INCLUDE="-I/data/uctpfos/local/include/"
export LOCAL_LIBS="-L/data/uctpfos/local/lib/"

在系统上。

R CMD INSTALL bkPackage并看到:

g++ -I/cm/shared/apps/R/3.0.1/lib64/R/include -DNDEBUG -W -I/cm/shared/apps/gsl/1.15/include -I/data/uctpfos/local/include -fPIC -I/usr/local/include -I"/data/uctpfos/R/x86_64-unknown-linux-gnu-library/3.0/Rcpp/include" -I"/data/uctpfos/R/x86_64-unknown-linux-gnu-library/3.0/RcppArmadillo/include" -I"/data/uctpfos/R/x86_64-unknown-linux-gnu-library/3.0/RcppGSL/include"   -fpic  -O3 -fPIC -c RcppExports.cpp -o RcppExports.o

g++ -I/cm/shared/apps/R/3.0.1/lib64/R/include -DNDEBUG -W -I/cm/shared/apps/gsl/1.15/include -I/data/uctpfos/local/include -fPIC -I/usr/local/include -I"/data/uctpfos/R/x86_64-unknown-linux-gnu-library/3.0/Rcpp/include" -I"/data/uctpfos/R/x86_64-unknown-linux-gnu-library/3.0/RcppArmadillo/include" -I"/data/uctpfos/R/x86_64-unknown-linux-gnu-library/3.0/RcppGSL/include"   -fpic  -O3 -fPIC -c solve.cpp -o solve.o

在链接步骤之后出现问题:

g++ -shared -L/usr/local/lib64 -o bkPackage.so RcppExports.o solve.o -L/cm/shared/apps/gsl/1.15/lib -lgsl -lgslcblas -lm -L/data/uctpfos/local/lib -linterp2d -L/data/uctpfos/R/x86_64-unknown-linux-gnu-library/3.0/Rcpp/lib -lRcpp -Wl,-rpath,/data/uctpfos/R/x86_64-unknown-linux-gnu-library/3.0/Rcpp/lib

错误如下:

/usr/bin/ld: /data/uctpfos/local/lib/libinterp2d.a(interp2d_spline.c.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC 
/data/uctpfos/local/lib/libinterp2d.a: could not read symbols: Bad value

正如你所看到的,我用-fPIC编译了这个,所以不可能。

1 个答案:

答案 0 :(得分:2)

抱怨libinterp2d.a未使用-fPIC编译;你确定它也是用-fPIC编译的吗?

此外,您的旗帜中似乎都有-fpic-fPIC;你可能只想要-fPIC。我认为R实际上确保默认开启。