Am Fre, 2002-10-25 um 02.39 schrieb Martin Knipper:
Hi zusammen, ein Linkerproblem macht mich wahrsinnig.
[...] #include <unistd.h> #include <stdio.h>
char *crypt(const char *key, const char *salt); [..] printf("%s\n",crypt(argv[1],argv[2])); [..] Kompiliere ich obiges nun mit gcc -o crypt-word cr.c -lcrypt klappt es wunderbar.
Ein "g++ -o crypt-word cr.c -lcrypt" liefert mir /tmp/ccVn9pCl.o: In function `main': /tmp/ccVn9pCl.o(.text+0x3c): undefined reference to `crypt(char const *, char const *)' collect2: ld returned 1 exit status Womit g++ recht hat: Stichwort Mangling.
Wie kann ich mit C++ gegen die C Bibliothek linken ? Statt des lokalen Prototypen, der, von einem C++ Compiler interpretiert, eine C++-Funktion namens
char *crypt(const char *, const char *); deklariert, den richtigen Header einbinden: #include <crypt.h> Oder aber den lokalen Prototypen in eine C++-konforme C-Funktions-Deklaration umschreiben: #ifdef __cplusplus extern "C" { #endif char *crypt(const char *, const char *); #ifdef __cplusplus } #endif bzw. #ifdef __cplusplus extern "C" #endif char *crypt(const char *, const char *); Der sauberste Weg wäre "#include <crypt.h>"
Wenn jemand die Antwort kennt, wäre ich sehr dankbar über eine Aufklärung. Habe das Problem leider schon desöfteren gehabt :( Stichworte: Mangling, extern "C", siehe auch man c++filt.
Ralf