C++ C++;链接错误:编译器找不到函数的定义

C++ C++;链接错误:编译器找不到函数的定义,c++,linker,makefile,C++,Linker,Makefile,我有一个文件Cache.cpp,它具有相应的头文件Cache.h,还有一个NetFunctions.cpp,它具有相应的头文件NetFunction.h 我有一个像这样的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

我有一个文件Cache.cpp,它具有相应的头文件Cache.h,还有一个NetFunctions.cpp,它具有相应的头文件NetFunction.h

我有一个像这样的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***
NetFunctions.cpp

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

#include "NetFunctions.h"
#include "Cache.h"
string Cache::getHTML(string request)
{
//some code
    string response = getNFHTML(request);
//some code
}
我已经删除了这些文件,因为它们包含数百行更改:

cache: Cache.cpp net
    g++ -c Cache.cpp ../obj/NetFunctions.o -o ../obj/Cache.o
致:

更好的是,去掉伪目标并打开编译器警告:

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

虽然您的
Makefile
非常糟糕,但很明显,如果您所说的是:

NetFunctions.cpp中定义了一个函数getNFHTML(string)

如果是真的,那么它就会起作用。因此,你一定是在对我们撒谎。在
NetFunctions.cpp
中显示
getNFHTML
的代码,或者至少显示以下内容的输出:

nm ../obj/NetFunctions.o | grep getNFHTML
更新:

好吧,你告诉我们的是真的。但是,似乎无法链接的目标被称为
test
,并且您的makefile中没有这样的目标

我猜该目标正在链接,但链接线上没有所需的
NetFunctions.o


在任何情况下,请用失败的实际链接行更新您的问题。

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

您的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: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
目标,变量
$^
表示接受所有先决条件,
$@
是规则的目标。这意味着您可以添加任意数量的对象文件,所有文件都将被链接


对于源代码到对象文件的编译,
$这是“000000000000100t_Z9getNFHTMLSs”上面的命令的输出嘿,谢谢,我的makefile就像你说的那样被破坏了。我使用了Joachim告诉我的方式来编写makefile,现在它没有给出任何错误。谢谢当您加粗错误时,您会看到部分错误消息被HTML吞噬。请不要那样做。在上一个目标中,你是指../obj/Cache.o:Cache.cpp吗
nm ../obj/NetFunctions.o | grep getNFHTML
.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 $@