2016-04-19 11 views
1

Ich schreibe gerade ein R-Paket packageFoo mit RcppArmadillo. Ich habe jedoch Probleme, mein Paket in Linux zu kompilieren. Ich wäre wirklich froh, wenn mir jemand helfen könnte. Ich weiß nicht, was ich falsch mache.Verknüpfung mit RcppArmadillo (lapack) schlägt fehl: undefined Symbol: dgesdd_

Ich habe nur eine einzige CPP-Datei mit dem folgenden Header:

#include <stdio.h> 
#include <string> 
#include <bitset> 
#include <fstream> 
#include <algorithm> 
#include <iostream> 
#include <cmath> 
#include <RcppArmadillo.h> 
// [[Rcpp::depends(RcppArmadillo)]] 

using namespace Rcpp; 

Als ich devtools::load_all() ich folgendes erhalten:

* installing *source* package ‘packageFoo’ ... 
** libs 
g++ -I/usr/share/R/include -DNDEBUG -I"/home/user/R/x86_64-pc-linux-gnu-library/3.2/Rcpp/include" -I"/home/user/R/x86_64-pc-linux-gnu-library/3.2/RcppArmadillo/include" -fpic -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 -g -c RcppExports.cpp -o RcppExports.o 
g++ -I/usr/share/R/include -DNDEBUG -I"/home/user/R/x86_64-pc-linux-gnu-library/3.2/Rcpp/include" -I"/home/user/R/x86_64-pc-linux-gnu-library/3.2/RcppArmadillo/include" -fpic -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 -g -c functions.cpp -o functions.o 
g++ -shared -L/usr/lib/R/lib -Wl,-Bsymbolic-functions -Wl,-z,relro -o packageFoo.so RcppExports.o functions.o -L/usr/lib/R/lib -lR 
installing to /tmp/Rtmpvf8B08/devtools_install_63383fe5bd9a/packageFoo/libs 
* DONE (packageFoo) 
Loading required package: Matrix 
Error in dyn.load(dllfile) : 
    unable to load shared object '/home/user/Documents/packageFoo/src/packageFoo.so': 
    /home/user/Documents/packageFoo/src/packageFoo.so: undefined symbol: dgesdd_ 

Ich googeln um und stellte fest, dass dgesdd_ gehört lapack . Die Überprüfung der Verknüpfung mit ldd von packageFoo.so zeigt keine verknüpften lapack Bibliotheken.

linux-vdso.so.1 => (0x00007ffc3615f000) 
    libR.so => /usr/lib/libR.so (0x00007f696e061000) 
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f696dd5d000) 
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f696da57000) 
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f696d841000) 
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f696d47c000) 
    libblas.so.3 => /usr/lib/libblas.so.3 (0x00007f696d1ff000) 
    libreadline.so.6 => /lib/x86_64-linux-gnu/libreadline.so.6 (0x00007f696cfb9000) 
    libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f696cd7b000) 
    liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f696cb59000) 
    libbz2.so.1.0 => /lib/x86_64-linux-gnu/libbz2.so.1.0 (0x00007f696c949000) 
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f696c730000) 
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f696c528000) 
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f696c324000) 
    libgomp.so.1 => /usr/lib/x86_64-linux-gnu/libgomp.so.1 (0x00007f696c115000) 
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f696bef7000) 
    /lib64/ld-linux-x86-64.so.2 (0x00007f696e831000) 
    libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f696bcce000) 

Meine MakeVars Datei sieht wie folgt aus:

PKG_LIBS = $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) 

wie in der RcppArmadillo Dokumentation beschrieben. Und läuft R CMD config LAPACK_LIBS kehrt -llapack

Ich bin mit R 3.2.5 mit Rcpp_0.12.4, RcppArmadillo_0.6.700.3.0 und devtools_1.11.0

+0

'MakeVars' sollte' Makevars' oder 'Makevars.win' sein und in das' src/'Verzeichnis gestellt werden. Aus reiner Neugierde, 'RcppArmadillo_0.6.500. *' Arbeit für Sie? 'devtools :: install_version ('RcppArmadillo', '0.6.500.4.0')' – coatless

+0

Danke. Das Umbenennen von 'MakeVars' in' Makevars' löste es. Ein dummer Fehler, der hätte vermieden werden sollen, wenn wir 'RcppArmadillo.package.skeletonO()' wie von @Dirk vorgeschlagen verwendet hätten. Ich kann Dirks Antwort annehmen oder Sie geben Ihre eigene Antwort. – DUWUDA

Antwort

2

Das Problem ist mit dem Namen der Datei Makevars. Ändern Sie den Namen MakeVars zu Makevars (Unix/Linux) oder Makevars.win (Windows) speziell und stellen Sie sicher, dass es in dem Verzeichnis src/ platziert wird.

3

Irgend etwas stimmt nicht mit Ihrem Paket oder Setup als Verknüpfungslinie, die Sie zitieren:

g++ -shared -L/usr/lib/R/lib -Wl,-Bsymbolic-functions -Wl,-z,relro \ 
     -o packageFoo.so RcppExports.o functions.o \ 
     -L/usr/lib/R/lib -lR 

tut nicht enthalten die LAPACK/BLAS-Bibliotheken.

Vielleicht mit einem einfachen Paket über RcppArmadillo.package.skeleton() neu anfangen und vergleichen?

+0

Also das Problem war, dass 'MakeVars'' Makevars' hätte sein sollen. Es tut mir leid. Dieses Problem hätte vermieden werden sollen, wenn wir 'RcppArmadillo.package.skeletonO()' – DUWUDA

+0

genau verwendet hätten. Deshalb haben Helferfunktionen diese Stanzen zu erstellen. –