Связывание 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