2017-03-21 3 views
-1

私はこれが愚かだと確信していますが、このリンカエラー undefined reference to insert_recordはOperations.cppで実装され、mainで使われているOperations.hppで宣言された関数です。このメイクファイルで間違っています。 多分、休息した目のペアが問題を見つけることができます。 オブジェクトが作成されていても、操作はリンクされていないようです。リンクされたエラー/メイクファイル

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 

更新: 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) 

すべてがメインで細かいようです..

+0

"このリンカエラーが発生しました" - どのリンカエラー? –

+0

私のばかげて申し訳ありません:D。編集されました! –

+0

トピックを外していますが...あなたのメイクファイルの依存関係はちょっと奇妙なようです。たとえば、 'HashTable.cn 'への依存性や' OBJS'で指定された他のファイルと同様に、 'HashTable.o'のさまざまなヘッダへの依存性を指定します。 –

答えて

0

Makefileにはエラーはありません。 @ G.M。対応する.cppへの.oの依存関係が欠落していることに注意してください。これらを追加する必要があります。

insert_recordの宣言がOperations.cppの定義と一致せず、2つの関数insert_recordで終わることがあります。関数の宣言と定義が一致していることを確認します。同じ戻り値の型と引数の型は、両方とも同じ名前空間にあります。メイクファイルのこのタイプは、あなたのエラーの多くを避けることができます

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 

0

私はあなたがより良いこのようなものを使用すべきだと思います。

また、依存関係としてhppファイルを配置する必要はありません。

幸運。 Operations.cpp

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

あなたは異なるシグネチャを持つ関数を定義Operations.hpp

0

あなたが署名と宣言してい

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

をそうOperations.hppでの宣言は実際に実装されていませんOperations.cpp にあり、未定義です。

関連する問題