Имам нужда от малко помощ за грешка на свързване, която получавам по време на инсталиране на Rcpp пакет на Linux система, където нямам администраторски права. Накратко, получавам тази грешка:
преместване R_X86_64_32 срещу `.rodata' не може да се използва при създаване на споделен обект; прекомпилирайте с -fPIC
Имам файл solve.cpp
, който използва външна библиотека interp2d, която от своя страна има 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, така че не може да е така.
libinterp2d.a
не е компилиран с-fPIC
; сигурни ли сте, че това също е компилирано с-fPIC
включено? Също така изглежда, че и двамата имате-fpic
и-fPIC
във вашите флагове; вероятно просто искате-fPIC
. Мисля, чеR
всъщност гарантира, че това е включено по подразбиране. - person Kevin Ushey   schedule 13.01.2014