链接错误/ Makefile

时间:2017-03-21 18:17:58

标签: c++ gcc makefile linker

我确定这是愚蠢但我得到这个链接器错误 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)

主要看起来都很好..

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分: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 $@ -c $< $(CXXFLAGS)

clean:
        rm -f $(OBJ)

fclean: clean
        rm -f $(NAME)

re:     fclean all

.PHONY: all clean fclean re

这种类型的makefile可以避免很多错误。

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

祝你好运。

答案 2 :(得分: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中实施 并且未定义。