URL: https://www.overclockers.at/coding-stuff/c-undefined-reference-bei-externer-funktion_241439/page_1 - zur Vollversion wechseln!
In dem im Anhang befindlichen Code (kompilierbar mit einer aktuellen gcc Version) versuche ich eine externe Funktion aufzurufen (poly1305_aes_ppro_authenticate), für welche das Headerfile angegeben ist.
Leider kenn ich mich nicht gut genug mit dem einbinden von externen Funktionen aus, um das Problem mit Hilfe von Google zu lösen. Ich bin mir nichtmal sicher, ob überhaupt der Code selbst dran Schuld ist, oder ob sich der Fehler nicht sogar rein aufs makefile beschränkt 
Auszug aus dem cpp file:
Code: CPP#ifndef AES_PPRO_H #define AES_PPRO_H #include "aes_ppro.h" #endif #ifndef POLY1305_PPRO_H #define POLY1305_PPRO_H #include "poly1305_ppro.h" #endif #ifndef POLY1305AES_PPRO_H #define POLY1305AES_PPRO_H #include "poly1305aes_ppro.h" #endif extern void poly1305_aes_ppro_authenticate(unsigned char out[16], const unsigned char kr[32], const unsigned char n[16], const unsigned char m[], unsigned int bytelen);
Code: MAKEFILECC=g++ CFLAGS=-c -L/usr/lib/ -masm=intel LDLIBS=-L/usr/lib/ -lcryptopp -L/usr/lib -lgmp -L/usr/lib -lssl -lcrypto all: mac mac: mac.o $(CC) poly1305aes_ppro_authenticate.c mac.o -o mac $(LDLIBS) mac.o: mac.cpp $(CC) $(CFLAGS) mac.cpp clean: rm -rf *o mac
die include guard zeilen gehören in die header files.
Dort sind sie auch drin. Ich hab sie im Laufe der Fehlersuche nur noch zusätzlich ins main file geschrieben 
was keinen sinn macht.
Lies mal das make manual und zieh auch das gcc manual bezüglich lib linken zu rate. Dafür sind sie schließlich da.
Das hab ich schon gemacht. Darum hab ich auch geschrieben, dass es sich vermutlich um ein Verständnisproblem, welches ich nicht mit Google lösen kann (zumindest hätte ich die passenden Suchbegriffe noch nicht gefunden).
Ich wende mich keineswegs hierhin, wenn ein Problem auftritt, um mich selbst damit nicht zu beschäftigen.
Das gcc manual bez. lib linken würde mir hier btw. auch nicht weiterhelfen, nachdem ich im konkreten Fall keine lib verwende (wie ich diese einbinden würde weiß ich - die im makefile angegebenen libs sind ein überbleibsel eines Codes, den ich gekürzt habe um diesen übersichtlicher zu gestalten), sondern sämtlicher verwendeter code in im selben Verzeichnis liegenden Dateien befindet.
Ohne den Text schon gelesen zu haben, riecht es nach extern "C" { ... }.
Zitat von RingdingOhne den Text schon gelesen zu haben, riecht es nach extern "C" { ... }.

Ich kann’s frühestens am Abend genauer anschauen, aber du solltest jedenfalls beide Sourcefiles einzeln übersetzen, mit -c. Und dann das executable bauen, indem du die beiden .o-Files zusammenlinkst. Und das C-File solltest du wohl auch mit gcc compilieren, nicht mit g++.
Zitat von RingdingIch kann’s frühestens am Abend genauer anschauen, aber du solltest jedenfalls beide Sourcefiles einzeln übersetzen, mit -c. Und dann das executable bauen, indem du die beiden .o-Files zusammenlinkst. Und das C-File solltest du wohl auch mit gcc compilieren, nicht mit g++.
1. Da ist ja 32-Bit-Code drinnen. Baust du auf einem 32bittigen System?
2. Du musst wohl die ganzen Assemblerfiles (*.s) auch dazulinken.
Leider gibts von dem Code keine 64 Bit Variante. Aber ja, ich builde auf nem 32Bit OS.
Ich hab das makefile jetzt noch von altem Code befreit und die Assablerfile dazugellinkt, bekomme aber nach wie vor denselben Fehler. Außerdem regt sich der compiler jetzt auf, dass in den übernommenen sourcefiles keine main() Funktion enthalten ist (-c Flag ist gesetzt).
Code: MAKEFILECC=gcc CFLAGS=-c -L/usr/lib/ -masm=intel LDLIBS= all: poly1305aes_ppro_authenticate poly1305aes_ppro_clamp mac mac: mac.o poly1305aes_ppro_authenticate.o poly1305aes_ppro_authenticate.o aes_ppro.o poly1305_ppro.o poly1305aes_ppro.o $(CC) -g -o mac mac.o poly1305aes_ppro_clamp.o poly1305aes_ppro_authenticate.o aes_ppro.o poly1305_ppro.o poly1305aes_ppro.o mac.o: mac.cpp $(CC) $(CFLAGS) mac.cpp poly1305aes_ppro_authenticate.o: poly1305aes_ppro_authenticate.c $(CC) $(CFLAGS) poly1305aes_ppro_authenticate.c poly1305aes_ppro_clamp.o: poly1305aes_ppro_clamp.c $(CC) $(CFLAGS) poly1305aes_ppro_clamp.c poly1305_ppro.o: poly1305_ppro.s $(CC) $(CFLAGS) poly1305_ppro.s poly1305aes_ppro.o: poly1305aes_ppro.s $(CC) $(CFLAGS) poly1305aes_ppro.s aes_ppro.o: aes_ppro.s $(CC) $(CFLAGS) aes_ppro.s clean: rm -rf *o mac
Aber was ist jetzt der genaue Wortlaut des Fehlers?
Code:mk@mk-virtual-machine:~/Documents/MAC1$ make gcc poly1305aes_ppro_authenticate.o -o poly1305aes_ppro_authenticate /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 0 has invalid symbol index 11 /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 1 has invalid symbol index 12 ... /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_line): relocation 0 has invalid symbol index 2 /usr/lib/gcc/i686-linux-gnu/4.8/../../../i386-linux-gnu/crt1.o: In function `_start': (.text+0x18): undefined reference to `main' poly1305aes_ppro_authenticate.o: In function `poly1305aes_ppro_authenticate': poly1305aes_ppro_authenticate.c:(.text+0x3e): undefined reference to `aes_ppro' poly1305aes_ppro_authenticate.c:(.text+0x68): undefined reference to `poly1305_ppro' collect2: error: ld returned 1 exit status make: *** [poly1305aes_ppro_authenticate] Error 1
Kannst du einen diff lesen? Solltest du
. (Minus-Zeilen weg, Plus-Zeilen dazu)
So geht’s.
Code:--- a/mac.cpp +++ b/mac.cpp @@ -9,7 +9,6 @@ #include "aes_ppro.h" #include "poly1305_ppro.h" #include "poly1305aes_ppro.h" -extern void poly1305_aes_ppro_authenticate(unsigned char out[16], const unsigned char kr[32], const unsigned char n[16], const unsigned char m[], unsigned int bytelen); @@ -43,7 +42,7 @@ lapclk[0]=clock(); for(int i=0; i<rounds; i++){ - poly1305_aes_ppro_authenticate(out, kr[i], n[i], m[i], bytelen); + poly1305aes_ppro_authenticate(out, kr[i], n[i], m[i], bytelen); } lapclk[1]=clock(); --- a/poly1305aes_ppro.h +++ b/poly1305aes_ppro.h @@ -7,6 +7,10 @@ #ifndef POLY1305AES_PPRO_H #define POLY1305AES_PPRO_H +#ifdef __cplusplus +extern "C" { +#endif + extern void poly1305aes_ppro_clamp(unsigned char kr[32]); extern void poly1305aes_ppro_authenticate(unsigned char out[16], @@ -29,4 +33,8 @@ extern int poly1305aes_ppro_isequal(const unsigned char x[16], const unsigned char y[16]); +#ifdef __cplusplus +} +#endif + #endif
Code:objects = aes_ppro.o aes_ppro_constants.o poly1305_ppro.o poly1305_ppro_constants.o poly1305aes_ppro_authenticate.o poly1305aes_ppro_clamp.o mac.o all: mac mac: $(objects) $(CXX) -g -o $@ $(objects) clean: rm -rf *o mac
thx vielmals, du hast mir sehr geholfen!
overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2026