"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

C++: undefined reference bei externer Funktion

schizo 12.12.2014 - 17:57 2806 14
Posts

schizo

Produkt der Gesellschaft
Avatar
Registered: Feb 2003
Location: Vienna
Posts: 2501
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
mac1_199206.zip (downloaded 114x)
Bearbeitet von schizo am 12.12.2014, 17:59

Nico

former person of interest
Registered: Sep 2006
Location: -
Posts: 4082
die include guard zeilen gehören in die header files.

schizo

Produkt der Gesellschaft
Avatar
Registered: Feb 2003
Location: Vienna
Posts: 2501
Dort sind sie auch drin. Ich hab sie im Laufe der Fehlersuche nur noch zusätzlich ins main file geschrieben :(

Nico

former person of interest
Registered: Sep 2006
Location: -
Posts: 4082
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

Produkt der Gesellschaft
Avatar
Registered: Feb 2003
Location: Vienna
Posts: 2501
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

Pilot
Avatar
Registered: Jan 2002
Location: Perchtoldsdorf/W..
Posts: 4300
Ohne den Text schon gelesen zu haben, riecht es nach extern "C" { ... }.

schizo

Produkt der Gesellschaft
Avatar
Registered: Feb 2003
Location: Vienna
Posts: 2501
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

Pilot
Avatar
Registered: Jan 2002
Location: Perchtoldsdorf/W..
Posts: 4300
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

Produkt der Gesellschaft
Avatar
Registered: Feb 2003
Location: Vienna
Posts: 2501
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.
mac1_199213.zip (downloaded 102x)

Ringding

Pilot
Avatar
Registered: Jan 2002
Location: Perchtoldsdorf/W..
Posts: 4300
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

Produkt der Gesellschaft
Avatar
Registered: Feb 2003
Location: Vienna
Posts: 2501
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

Pilot
Avatar
Registered: Jan 2002
Location: Perchtoldsdorf/W..
Posts: 4300
Aber was ist jetzt der genaue Wortlaut des Fehlers?

schizo

Produkt der Gesellschaft
Avatar
Registered: Feb 2003
Location: Vienna
Posts: 2501
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

Pilot
Avatar
Registered: Jan 2002
Location: Perchtoldsdorf/W..
Posts: 4300
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

Produkt der Gesellschaft
Avatar
Registered: Feb 2003
Location: Vienna
Posts: 2501
:eek: thx vielmals, du hast mir sehr geholfen!
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz