gpt4 book ai didi

C++ 链接错误 : the compiler can not find the definition of the function

转载 作者:行者123 更新时间:2023-11-28 08:13:32 28 4
gpt4 key购买 nike

我有一个具有相应头文件 Cache.h 的文件 Cache.cpp 和另一个具有相应头文件 NetFunction.h 的 NetFunctions.cpp。

我有一个看起来像这样的 makefile

all: net cache
g++ main.cpp ../obj/NetFunctions.o ../obj/Cache.o -o ../bin/main
net: NetFunctions.cpp
g++ -c NetFunctions.cpp -o ../obj/NetFunctions.o
cache: Cache.cpp net
g++ -c Cache.cpp ../obj/NetFunctions.o -o ../obj/Cache.o

现在 NetFunctions.cpp 中定义了一个函数 getNFHTML(string),它在 Cache.cpp 中使用。我已经检查了头文件,它们看起来很适合所有函数,在那里声明并正确包含头文件。

但是,当我制作时,出现以下链接器错误

../obj/Cache.o: In function `Cache::getHTML(std::basic_string<char,  std::char_traits<char>, std::allocator<char> >)':
Cache.cpp:(.text+0x19ee): undefined reference to `getNFHTML(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
collect2: ld returned 1 exit status
make: *** [test] Error 1***

有人可以帮我解决这个问题吗?有什么问题?

我也引用了这篇文章C++ Linking error ,但这对我没有帮助。

编辑

代码如下:网络函数.h

#ifndef NET
#define NET 1

#include "commons.h"

bool serv_bind(struct addrinfo **servinfo, struct addrinfo **p, int *sockfd, int *yes);
void* get_in_addr(struct sockaddr *sa);
string getNFHTML(string website);
string saveHeaders(string);
//bool getNFHTML(string request, string last_modified, string *response);
extern bool useCache;

#endif

NetFunctions.cpp

    #include "NetFunctions.h"
string getNFHTML(string request)
{
// a lot of code
}

缓存.cpp

#include "NetFunctions.h"
#include "Cache.h"
string Cache::getHTML(string request)
{
//some code
string response = getNFHTML(request);
//some code
}

我已经删除了文件,因为它们包含几百行

最佳答案

这与问题无关,但我将其放在答案中以便更好地格式化。

您的 makefile 不能很好地处理依赖关系。试试这个:

.PHONY: all
all: ../bin/main

../bin/main: main.cpp ../obj/NetFunctions.o ../obj/Cache.o
g++ $^ -o $@

../obj/NetFunctions.o: NetFunctions.cpp
g++ -c $< -o $@

../obj/Cache.o: Cache.cpp
g++ -c $< -o $@

对于 ../bin/main目标,变量 $^意味着采取所有先决条件,并且$@是规则的目标。这意味着您可以添加任意数量的目标文件,并且所有目标文件都将被链接。

对于目标文件的源代码编译,$<变量是第一个前提。如果您添加更多文件,这也将使复制/粘贴目标变得更加容易。

规则还确保当您构建 ../bin/main 时它所依赖的所有文件都将被正确构建。

第一个目标,all , 如果您运行 make 将是默认值没有指定目标。它已被标记为虚假目标,因为它不会生成名为 all 的文件。 .

请注意,我将其基于 GNU make,这是几乎所有 Linux 发行版和 Cygwin/MingW 中的标准配置。如果您使用 BSD make,变量可能会改变。

关于C++ 链接错误 : the compiler can not find the definition of the function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8382099/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com