2017-03-21 68 views
-1

我相信这是愚蠢的,但我得到这个链接器错误 undefined reference to insert_record,这是一个函数在Operations.hpp中声明,在Operations.cpp中实现并在main中使用,我找不到是什么在这个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 

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

偏离主题,但...你的makefile依赖似乎有点奇怪。例如,你可以指定'HashTable.o'对各种头文件的依赖关系,而不是对'HashTable.cpp'的依赖 - 而对'OBJS'中指定的其他文件也是如此。 –

回答

0

您的Makefile似乎没有错误。作为@ G.M。注意到,.o与相应的.cpp的依赖关系缺失,需要添加这些依赖关系。

Operations.hpp中的insert_record声明可能与Operations.cpp中的定义不匹配,您最终得到两个函数insert_record。检查函数声明和定义是否匹配:相同的返回类型和参数类型,都在相同的名称空间中。

0

我认为你应该更好地使用这样的事情:

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 

这种类型的makefile将避免你很多的错误。

此外,您不需要将hpp文件作为依赖关系。

祝你好运。

0

Operations.hpp你有签名的声明:

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

Operations.cpp定义与不同的签名功能:

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

所以在Operations.hpp声明其实也不是实现的在Operations.cpp 并且未定义。