我确定这是愚蠢但我得到这个链接器错误
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)
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
中实施
并且未定义。