002
06.05.2008, 17:12 Uhr
0xdeadbeef
Gott (Operator)
|
Das wird am Name-Mangling liegen. In C++-Code werden, um Polymorphismus und Klassenmethoden zu ermöglichen, alle Symbolnamen auf eine bestimmte Weise kodiert, die sich von der C-"Kodierung" unterscheidet. Der C++-Code scheint hier nach dem gemangelten Namen zu suchen, und da die Bibliothek nur den C-Namen enthält, nicht zu finden.
Das lässt sich prinzipiell ganz einfach umgehen; in C++ können Funktionsnamen als C-Namen exportiert werden (Natürlich entfallen damit alle Möglichkeiten der Überladung). Das sieht dann so aus:
C++: |
extern "C" void foo(void); /* oder */ extern "C" { void foo(void); }
|
Typischerweise wird das in den Headern von C-Bibliotheken direkt benutzt, um diese auch in C++ benutzbar zu machen, das sieht dann so aus:
C++: |
#ifndef INCLUDED_YOUR_HEADER_NAME_H #define INCLUDED_YOUR_HEADER_NAME_H
#ifdef __cplusplus extern "C" { #endif
/* C-Deklarationen hier */
#ifdef __cplusplus } #endif
#endif
|
...dies scheinen die CBLAS-Entwickler versäumt zu haben. Ich kenne mich mit CBLAS nicht aus, aber unter der Annahme, dass die einen Header cblas.h haben, sollte sich das beim Einbinden des Headers so:
C++: |
extern "C" { #include <cblas.h> }
|
lösen lassen. -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra |