2017-03-21 3 views
-1

Ich bin sicher, dass dies dumm ist, aber ich diesen Linkerfehler undefined reference to insert_record, die eine Funktion in Operations.hpp, implementiert in Operations.cpp und verwendete in Haupt-, und ich kann nicht finden, was erklärt ist, falsch in diesem Makefile. Vielleicht kann ein Paar ausgeruhte Augen das Problem erkennen. Es scheint, dass Operationen nicht verknüpft sind, obwohl das Objekt erstellt wird.verlinkte Fehler/Makefile

OBJS = main.o Operations.o CDR.o TBucketList.o RBucketList.o DateTime.o HashTable.o 
CC = g++ 
CXXFLAGS = -W -Wall -Wno-unused -pedantic -c -g 
LDFLAGS = -W -Wall -Wno-unused -pedantic -g 

werhaus: $(OBJS) 
    $(CC) $(LDFLAGS) $(OBJS) -o werhaus 

main.o : CDR.hpp Operations.hpp HashTable.hpp 
    $(CC) $(CXXFLAGS) main.cpp 

Operations.o : Operations.hpp HashTable.hpp 
    $(CC) $(CXXFLAGS) Operations.cpp 

TBucketList.o : TBucketList.hpp RBucketList.hpp 
    $(CC) $(CXXFLAGS) TBucketList.cpp 

RBucketList.o : RBucketList.hpp 
    $(CC) $(CXXFLAGS) RBucketList.cpp 

HashTable.o : HashTable.hpp TBucketList.hpp 
    $(CC) $(CXXFLAGS) HashTable.cpp 

CDR.o : CDR.hpp DateTime.hpp 
    $(CC) $(CXXFLAGS) CDR.cpp 

DateTime.o : DateTime.hpp 
    $(CC) $(CXXFLAGS) DateTime.cpp 

    clean: 
    \rm *.o werhaus 

Update: main.cpp:

insert_record(originator_number, aCDR, destination_number, hashtable1, hashtable2, BucketSize); 

Operations.hpp:

void insert_record(const char*, CDR*, const char*, const Hashtable*, const Hashtable*, int); 

Operations.cpp:

void insert_record(const char* originator_number, CDR* aCDR, const char* destination_number, Hashtable* hashtable1, Hashtable* hashtable2, int Bsize) 

Alles am feinen scheinen ..

+0

"Ich bekomme diesen Linker Fehler" - welcher Linker Fehler? –

+0

Entschuldigung für meine Dummheit: D. Edited! –

+0

Off topic aber ... Ihre Makefile Abhängigkeiten scheinen ein bisschen seltsam. Zum Beispiel geben Sie die Abhängigkeit von HashTable.o von verschiedenen Headern an, aber nicht von ihrer Abhängigkeit von HashTable.cpp - und ebenso von den anderen in OBJS angegebenen Dateien. –

Antwort

0

Es scheint keinen Fehler in Ihrem Makefile zu geben. Als @ G.M. Beachten Sie, dass die Abhängigkeiten von .o zu entsprechenden .cpp fehlen, diese müssen hinzugefügt werden.

kann es sein, dass insert_record Erklärung in Operations.hpp nicht der Definition in Operations.cpp und Sie mit zwei Funktionen insert_record am Ende überein. Überprüfen Sie, ob die Funktionsdeklaration und die Definitionen übereinstimmen: die gleichen Rückgabetyp- und Argumenttypen, beide im selben Namespace.

0

Ich glaube, Sie besser etwas wie folgt verwenden sollte:

NAME= werhaus 

CXX=   g++ # Use CXX for C++ 
CXXFLAGS=  -W -Wall -Wno-unused -pedantic -g 
LDFLAGS=  -g # No need for warning flags at linking 

SRC= main.cpp   \ 
     Operations.cpp \ 
     CDR.cpp   \ 
     TBucketList.cpp \ 
     RBucketList.cpp \ 
     DateTime.cpp  \ 
     HashTable.cpp 

OBJS= $(SRC:.cpp=.o) 

$(NAME): $(OBJS) 
     $(CXX) $(LDFLAGS) $(OBJS) -o $(NAME) 

all: $(NAME) 

%.o: %.cpp 
     $(CXX) -o [email protected] -c $< $(CXXFLAGS) 

clean: 
     rm -f $(OBJ) 

fclean: clean 
     rm -f $(NAME) 

re:  fclean all 

.PHONY: all clean fclean re 

Diese Art von Make-Datei viele Fehler Sie vermeiden.

Außerdem müssen Sie keine hpp-Dateien als Abhängigkeiten angeben.

Viel Glück.

0

In Operations.hpp haben Sie eine Erklärung mit Unterschrift:

void insert_record(
    const char*, CDR*, 
    const char*, 
    const Hashtable*, 
    const Hashtable*, 
    int) 

In Operations.cppSie eine Funktion mit der anderen Signatur definieren:

void insert_record(
    const char* CDR*, 
    const char*, 
    Hashtable*, 
    Hashtable*, 
    int) 

So die Erklärung in Operations.hpp ist in der Tat nicht umgesetzt in Operations.cpp und ist nicht definiert.