2016-07-15 18 views
1

Erkennen ich in einen Fehler am laufen, wenn die folgende C Kompilieren ++ Code:g ++ kompiliert nicht '*' für die Matrixmultiplikation mit Armadillo-Bibliothek

# include <iostream> 
# include <armadillo> 

using namespace arma; 
using namespace std; 

int main() { 
mat A; 
mat B; 
mat C; 

// Populating the matrices with random numbers 
A.randu(3,3); 
B.randu(3,3); 

// Matrix multiplication 
C = A * B; 

cout << "Mutliplying matrices A and B:" << endl; 
cout << "A * B = " << C << endl; 

return 0; 

}

Hier ist mein Fehler, wenn sie mit g ++ kompiliert:

Undefined symbols for architecture x86_64: "_wrapper_dgemm_", referenced from:

void arma::blas::gemm<double>(char const*, char const*, int const*, > int const*, int const*, double const*, double const*, int const*, double > const*, int const*, double const*, double*, int const*) in >armadillo_playground-aa3649.o 

"_wrapper_dgemv_", referenced from:

void arma::blas::gemv<double>(char const*, int const*, int const*, >double const*, double const*, int const*, double const*, int const*, >double const*, double*, int const*) in armadillo_playground-aa3649.o 

ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see >invocation)

Wenn ich die Matrixmultiplikation ersetzen '*' mit '+', '%' usw. der Code kompiliert, ohne zu klagen.

Vielen Dank im Voraus!

+0

Sieht aus, als ob die Definition für den Operator '*' in der Quelldatei enthalten ist und Sie die Bibliothek nicht verknüpfen? –

+0

Hoppla, ich wusste nichts von der Verknüpfung in der Bibliothek. Ich habe jetzt jedoch folgenden Fehler: dyld: Bibliothek nicht geladen: /usr/local/opt/gcc/lib/gcc/6/libgfortran.3.dylib Referenziert von:/usr/local/opt/arpack/libexec/lib/libarpack.2.dylib Grund: Bild nicht gefunden Trace/BPT-Trap: 5 –

+0

Vielleicht hilft das? http://stackoverflow.com/questions/24993752/os-x-framework-library-not-loaded-image-not-found –

Antwort

0

Der Fehler ist ein einfacher Linker Fehler, den Sie durch richtiges Bauen überwinden können. Genau das, was Sie auf Ihrem System/OS abhängen müssen (und alle dokumentiert ist), aber auf meiner Linux-Box das funktioniert:

[email protected]:/tmp$ g++ -o arma arma.cpp -larmadillo 
[email protected]:/tmp$ ./arma 
Mutliplying matrices A and B: 
A * B = 1.0574 1.0356 1.5178 
    1.1368 1.3434 1.4919 
    0.7028 0.6516 1.0423 

[email protected]:/tmp$ 

Hier arma.cpp ist die Datei Ihres Beispiel enthält. Die Verknüpfung mit der Bibliothek libarmadillo.so ist ausreichend, da sie mit LAPACK- und BLAS-Bibliotheken verknüpft ist. Andere Betriebssysteme können unterschiedliche Verwendungsmuster haben.

+0

Danke für die Eingabe, Dirk. Ich bin ein Anfänger und habe immer noch Probleme. Ich blieb stecken, also entschied ich mich zu deinstallieren und neu zu installieren mit Homebrew. Nach der Installation von brew wechselte ich in das Verzeichnis '/usr/local/Cellar/armadillo/7.200.2' und versuchte CMake auszuführen, wie in der readme.txt beschrieben. Ich renne jetzt in diesen Fehler: Verzeichnis scheint CMakeLists.txt nicht zu enthalten. –

+0

@ToddYoung - Nachdem Sie Armadillo mit Homebrew installiert haben, müssen Sie es nicht erneut mit CMake installieren. – mtall