Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » CBLAS linker problem

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
06.05.2008, 16:45 Uhr
~kronosos
Gast


Hallo,
ich versuche gerade CBLAS-Funktionen in c++ einzubinden.
Kann mir jemand erklären, warum folgender linker-fehler nur auftritt wenn mit g++ kompiliert wurde und es mit gcc keine Probleme gibt?

Code:
$ gcc test.c ./cblas_LINUX.a -lblas
$ cp test.c test.cpp
$ g++ test.cpp ./cblas_LINUX.a -lblas
/tmp/ccYxtlCn.o: In function `blub()':
test.cpp:(.text+0x1d): undefined reference to `cblas_isamax(int, float const*, int)'
collect2: ld returned 1 exit status


Habe schon versucht einen C-wrapper für die Funktionen zu schreiben, aber sobald g++-Objektcode anwesend ist bekomme ich undefined references
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
06.05.2008, 17:07 Uhr
~kronosos
Gast


Oder allgemeiner: wie bekomme ich Objektcode von g++ und gcc zusammengebastelt?
Dachte das wäre ganz einfach...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
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
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
06.05.2008, 17:14 Uhr
~kronosos
Gast


Danke. Dieses Forum ist großartig.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: