Свързване на Rcpp към interp2d (библиотека от тип GSL)

Имам нужда от малко помощ за грешка на свързване, която получавам по време на инсталиране на 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, така че не може да е така.


person Florian Oswald    schedule 13.01.2014    source източник
comment
Оплаква се, че libinterp2d.a не е компилиран с -fPIC; сигурни ли сте, че това също е компилирано с -fPIC включено? Също така изглежда, че и двамата имате -fpic и -fPIC във вашите флагове; вероятно просто искате -fPIC. Мисля, че R всъщност гарантира, че това е включено по подразбиране.   -  person Kevin Ushey    schedule 13.01.2014
comment
трябва да публикувате това като отговор. прекомпилирането на libinterp2d с -fPIC го направи! Благодаря!   -  person Florian Oswald    schedule 13.01.2014


Отговори (1)


Оплаква се, че libinterp2d.a не е компилиран с -fPIC; сигурни ли сте, че това също е компилирано с -fPIC включено?

Също така изглежда, че и двамата имате -fpic и -fPIC във вашите флагове; вероятно просто искате -fPIC. Мисля, че R всъщност гарантира, че това е включено по подразбиране.

person Kevin Ushey    schedule 13.01.2014