Hi zusammen,
ein Linkerproblem macht mich wahrsinnig.
[...]
#include
Am Fre, 2002-10-25 um 02.39 schrieb Martin Knipper:
Hi zusammen, ein Linkerproblem macht mich wahrsinnig.
[...] #include
#include 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
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
Hallo, On Fri, 25 Oct 2002, Martin Knipper wrote:
Hi zusammen, ein Linkerproblem macht mich wahrsinnig.
[...] [Quelltextfragment nach unten verschoben]
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
Wie kann ich mit C++ gegen die C Bibliothek linken ?
Wie oben eigentlich. Klappt bei mir so. Verwendest du gcc-3.x? Maile doch mal die Ausgabe von 'g++ -v -lcrypt -o crypt-word crypt-word.c'. Ausserdem gibt's zu deinem Fragment einige Kritikpunkte.
#include
#include char *crypt(const char *key, const char *salt);
Was soll das? Den Header einbinden, aber dann doch selber den Prototyp angeben? Schonmal 'man 3 crypt' gelesen? Gegenvorschlag s.u.
int main(int argc, char *argv[]) { if(argc!=3) { printf("Aufruf mit Wort - Salz\n");
Schlechte Fehlermeldung. Man sollte sich schon an die ueblichen Floskeln halten und moeglichst Englisch verwenden. Gegenvorschlag s.u. [..]
printf("%s\n",crypt(argv[1],argv[2]));
*AUTSCH* Du pruefst argv[2] nicht auf Legalitaet! Und das solltest du.
Das 'salt' darf nur Zeichen aus [a-zA-Z./] enthalten!
Um ehrlich zu sein: deine oben gezeigte Sorgfalt spricht nicht dafuer,
dass du das Programm schreiben solltest (sofern es um "echte" und
nicht nur um "Programm-private" Passwoerter geht).
Denn sowas erfordert aeusserste Sorgfalt!
Schreib doch mal, was du denn ueberhaupt machen willst!
Denn ein Passwort via Kommandozeile zu uebergeben ist eine "Schlechte
Idee"[tm]. Dafuer gibt's getpass(3).
Hier mal mein Gegenvorschlag, der fuer's "Salt" /dev/random verwendet.
==== crypt-word.c ====
#ifndef _XOPEN_SOURCE
#define _XOPEN_SOURCE 1
#endif
#include
Hi zusammen, hi David, Am 10/25/2002 05:33 AM schrieb David Haller: [...]
Wie oben eigentlich. Klappt bei mir so. Verwendest du gcc-3.x? Maile doch mal die Ausgabe von 'g++ -v -lcrypt -o crypt-word crypt-word.c'.
---------------------------------- # g++ -v -lcrypt -o crypt-word crypt-word.c Reading specs from /usr/lib/gcc-lib/i486-suse-linux/2.95.3/specs gcc version 2.95.3 20010315 (SuSE) /usr/lib/gcc-lib/i486-suse-linux/2.95.3/cpp0 -lang-c++ -v -D__GNUC__=2 -D__GNUG__=2 -D__GNUC_MINOR__=95 -D__cplusplus -D__ELF__ -Dunix -D__i386__ -Dlinux -D__ELF__ -D__unix__ -D__i386__ -D__linux__ -D__unix -D__linux -Asystem(posix) -D__EXCEPTIONS -Acpu(i386) -Amachine(i386) -Di386 -D__i386 -D__i386__ -Di486 -D__i486 -D__i486__ crypt-word.c /tmp/ccF5JaEZ.ii GNU CPP version 2.95.3 20010315 (SuSE) (i386 Linux/ELF) #include "..." search starts here: #include <...> search starts here: /usr/include/g++ /usr/local/include /usr/lib/gcc-lib/i486-suse-linux/2.95.3/include /usr/include End of search list. The following default directories have been omitted from the search path: /usr/lib/gcc-lib/i486-suse-linux/2.95.3/../../../../i486-suse-linux/include End of omitted list. /usr/lib/gcc-lib/i486-suse-linux/2.95.3/cc1plus /tmp/ccF5JaEZ.ii -quiet -dumpbase crypt-word.cc -version -o /tmp/cc45fttO.s GNU C++ version 2.95.3 20010315 (SuSE) (i486-suse-linux) compiled by GNU C version 2.95.3 20010315 (SuSE). /usr/i486-suse-linux/bin/as -V -Qy -o /tmp/ccPnN4qE.o /tmp/cc45fttO.s GNU assembler version 2.11.92.0.10 (i486-suse-linux) using BFD version 2.11.92.0.10 20011021 (SuSE) /usr/lib/gcc-lib/i486-suse-linux/2.95.3/collect2 -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o crypt-word /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/gcc-lib/i486-suse-linux/2.95.3/crtbegin.o -L/usr/lib/gcc-lib/i486-suse-linux/2.95.3 -L/usr/i486-suse-linux/lib -lcrypt /tmp/ccPnN4qE.o -lstdc++ -lm -lgcc -lc -lgcc /usr/lib/gcc-lib/i486-suse-linux/2.95.3/crtend.o /usr/lib/crtn.o /tmp/ccPnN4qE.o: In function `main': /tmp/ccPnN4qE.o(.text+0x3c): undefined reference to `crypt(char const *, char const *)' collect2: ld returned 1 exit status ------------------------------------ Schlecht zu lesen. , aber wie man sieht, nicht den 3.x (Ist übrigens SuSE 8.0) <cut> berechtigte Kritik von David weggeschnitten </cut> Das war lediglich ein kleiner Codeschnipsel, um mein Problem zu verdeutlichen. Danke für eure Hilfe, Gruß Martin
Hallo, On Fri, 25 Oct 2002, Martin Knipper wrote:
Am 10/25/2002 05:33 AM schrieb David Haller:
[...]
Wie oben eigentlich. Klappt bei mir so. Verwendest du gcc-3.x? Maile doch mal die Ausgabe von 'g++ -v -lcrypt -o crypt-word crypt-word.c'.
Gnurpsel, das bringt leider nicht viel ;) Mein Fehler.
---------------------------------- # g++ -v -lcrypt -o crypt-word crypt-word.c [..] /usr/lib/gcc-lib/i486-suse-linux/2.95.3/collect2 -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o crypt-word /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/gcc-lib/i486-suse-linux/2.95.3/crtbegin.o -L/usr/lib/gcc-lib/i486-suse-linux/2.95.3 -L/usr/i486-suse-linux/lib -lcrypt /tmp/ccPnN4qE.o -lstdc++ -lm -lgcc -lc -lgcc /usr/lib/gcc-lib/i486-suse-linux/2.95.3/crtend.o /usr/lib/crtn.o /tmp/ccPnN4qE.o: In function `main': /tmp/ccPnN4qE.o(.text+0x3c): undefined reference to `crypt(char const *, char const *)' collect2: ld returned 1 exit status ------------------------------------
Schreib mal, ob und wo du die libcrypt denn hast. Mach also mal ein 'locate lib/libcrypt'. Und dann maile die Ausgabe (v.a. das Ende) von g++ -Wl,--verbose -lcrypt -o crypt-word crypt-word.c Achso, das von Ralf geschriebene gilt auch ;)
Das war lediglich ein kleiner Codeschnipsel, um mein Problem zu verdeutlichen.
Ok ;) -dnh -- 149: Telefon Gerät, das die Person am anderen Ende der Leitung bescheuert macht. (Funktioniert in beide Richtungen)
participants (3)
-
David Haller
-
Martin Knipper
-
Ralf Corsepius