C++: undefined reference bei externer Funktion

Seite 1 von 1 - Forum: Coding Stuff auf overclockers.at

URL: https://www.overclockers.at/coding-stuff/c-undefined-reference-bei-externer-funktion_241439/page_1 - zur Vollversion wechseln!


schizo schrieb am 12.12.2014 um 17:57

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);

Makefile:
Code: MAKEFILE
CC=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


Nico schrieb am 12.12.2014 um 18:20

die include guard zeilen gehören in die header files.


schizo schrieb am 12.12.2014 um 18:36

Dort sind sie auch drin. Ich hab sie im Laufe der Fehlersuche nur noch zusätzlich ins main file geschrieben :(


Nico schrieb am 12.12.2014 um 19:26

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.


schizo schrieb am 12.12.2014 um 19:52

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.


Ringding schrieb am 12.12.2014 um 20:25

Ohne den Text schon gelesen zu haben, riecht es nach extern "C" { ... }.


schizo schrieb am 12.12.2014 um 21:19

Zitat von Ringding
Ohne den Text schon gelesen zu haben, riecht es nach extern "C" { ... }.

Darauf bin ich zwar auch schon öfters gestoßen, jedoch ist dies nicht die Lösung des Problems :(


Ringding schrieb am 13.12.2014 um 12:32

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++.


schizo schrieb am 13.12.2014 um 13:32

Zitat von Ringding
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++.

Danke fürs drüberschauen!
Ursprünglich waren noch andere c++ Funktionen drin, darum hab ich bis jetzt g++ verwendet. Aber im Grunde is es kein Problem, den Teil abzuspalten und auf c zu wechseln.
Ich hab im makefile soeben die von dir genannten Punkte geändert, die Fehlermeldung bleibt jedoch dieselbe.


Ringding schrieb am 13.12.2014 um 14:23

1. Da ist ja 32-Bit-Code drinnen. Baust du auf einem 32bittigen System?

2. Du musst wohl die ganzen Assemblerfiles (*.s) auch dazulinken.


schizo schrieb am 13.12.2014 um 14:52

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: MAKEFILE
CC=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


Ringding schrieb am 13.12.2014 um 17:50

Aber was ist jetzt der genaue Wortlaut des Fehlers?


schizo schrieb am 13.12.2014 um 18:29

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


Ringding schrieb am 14.12.2014 um 21:07

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

Makefile:
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


schizo schrieb am 15.12.2014 um 00:11

:eek: thx vielmals, du hast mir sehr geholfen!




overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2026