C++ C++;Makefile中未定义的引用

C++ C++;Makefile中未定义的引用,c++,gcc,makefile,C++,Gcc,Makefile,我为一个简单的程序创建了Makefile,但它不断返回类函数的未定义引用: g++ -c src/main.cpp -o lib/main.o g++ -c src/functions.cpp -o lib/functions.o g++ -c src/Circular.cpp -o lib/Circular.o g++ lib/main.o -o bin/app.exe c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/

我为一个简单的程序创建了Makefile,但它不断返回类函数的未定义引用:

g++ -c src/main.cpp -o lib/main.o
g++ -c src/functions.cpp -o lib/functions.o
g++ -c src/Circular.cpp -o lib/Circular.o
g++ lib/main.o -o bin/app.exe
c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: lib/main.o:main.cpp:(.text+0x20): undefined reference to `Circular::Circular()'
collect2.exe: error: ld returned 1 exit status
make.exe: *** [app.exe] Error 1
这是我的Makefile:

app.exe: lib/main.o lib/Circular.o lib/functions.o
g++ lib/main.o -o bin/app.exe

lib/functions.o: src/functions.cpp
g++ -c src/functions.cpp -o lib/functions.o

lib/Circular.o: src/Circular.cpp
g++ -c src/Circular.cpp -o lib/Circular.o

lib/main.o: src/main.cpp
g++ -c src/main.cpp -o lib/main.o
下面是main.cpp的一个简短片段:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <fstream>
#include <string>


#include "../include/Circular.h"
#include "../include/functions.h"

using namespace std;

int main(int argc, const char * argv[]) {

     Circular item;
     return 0;
 }
通告.cpp:

#include "../include/Circular.h"
#include <iostream>

using namespace std;


Circular::Circular()
{
    start = NULL;
    last = NULL;            
}

我知道这个问题是关于链接器和Makefile的,但即使我尝试了不同的可能解决方案,它还是不起作用。因此,也许有人能看到我所犯的错误。谢谢

应该对
Makefile
进行结构化,以构建依赖项,然后将最终程序集构建为
.exe
。每个路径应按原样指定,而不是近似指定:

app.exe: lib/main.o lib/Circular.o lib/functions.o 
  g++ lib/main.o lib/Circular.o lib/functions.o -o app.exe

lib/main.o: src/main.cpp
  g++ -c src/main.cpp -o lib/main.o

lib/functions.o: src/functions.cpp
  g++ -c src/functions.cpp -o lib/functions.o

lib/Circular.o: src/Circular.cpp
  g++ -c src/Circular.cpp -o lib/Circular.o
这里的关键是要保持一致,包括在这个文件中指定的事情顺序。无论你选择什么顺序,都要坚持。这使得追踪问题变得更加容易


如果这个项目变得更复杂,您可能希望使用一个而不是这个自制的。请注意,在这些情况下,您不需要为每个文件指定规则,而是为每种类型的文件指定规则,如
.cpp
->
.o
,其余操作将自动执行。

应构建
生成文件
,然后将最终程序集构建为
.exe
。每个路径应按原样指定,而不是近似指定:

app.exe: lib/main.o lib/Circular.o lib/functions.o 
  g++ lib/main.o lib/Circular.o lib/functions.o -o app.exe

lib/main.o: src/main.cpp
  g++ -c src/main.cpp -o lib/main.o

lib/functions.o: src/functions.cpp
  g++ -c src/functions.cpp -o lib/functions.o

lib/Circular.o: src/Circular.cpp
  g++ -c src/Circular.cpp -o lib/Circular.o
这里的关键是要保持一致,包括在这个文件中指定的事情顺序。无论你选择什么顺序,都要坚持。这使得追踪问题变得更加容易


如果这个项目变得更复杂,您可能希望使用一个而不是这个自制的。请注意,在这些情况下,您不需要为每个文件指定规则,而是为每种类型的文件指定规则,如
.cpp
->
.o
,其余操作将自动执行。

我设法从中创建了一个Makefile

生成文件如下所示:

CXX = g++
CXXFLAGS = -std=c++17 -Wall
LXXFLAGS = -std=c++17
OBJECTS = main.o Circular.o functions.o
TARGET = main

$(TARGET): $(OBJECTS)
    $(CXX) $(LXXFLAG) $(OBJECTS) -o $(TARGET)
main.o: main.cpp Circular.cpp Circular.h functions.cpp functions.h
    $(CXX) $(CXXFLAGS) -c main.cpp
Circular.o: Circular.cpp 
    $(CXX) $(CXXFLAGS) -c Circular.cpp
functions.o: functions.cpp 
    $(CXX) $(CXXFLAGS) -c functions.cpp
clean:
    rm -f $(TARGET) $(OBJECTS)
还向您的循环构造函数添加了
cout
,以检查执行情况,如下所示:

#include "Circular.h"
#include <iostream>

using namespace std;


Circular::Circular()
{
    start = NULL;
    last = NULL;   
    cout << "Yes!" << endl;     
}
#包括“Circular.h”
#包括
使用名称空间std;
循环::循环()
{
start=NULL;
last=NULL;

我设法从中创建了一个Makefile

生成文件如下所示:

CXX = g++
CXXFLAGS = -std=c++17 -Wall
LXXFLAGS = -std=c++17
OBJECTS = main.o Circular.o functions.o
TARGET = main

$(TARGET): $(OBJECTS)
    $(CXX) $(LXXFLAG) $(OBJECTS) -o $(TARGET)
main.o: main.cpp Circular.cpp Circular.h functions.cpp functions.h
    $(CXX) $(CXXFLAGS) -c main.cpp
Circular.o: Circular.cpp 
    $(CXX) $(CXXFLAGS) -c Circular.cpp
functions.o: functions.cpp 
    $(CXX) $(CXXFLAGS) -c functions.cpp
clean:
    rm -f $(TARGET) $(OBJECTS)
还向您的循环构造函数添加了
cout
,以检查执行情况,如下所示:

#include "Circular.h"
#include <iostream>

using namespace std;


Circular::Circular()
{
    start = NULL;
    last = NULL;   
    cout << "Yes!" << endl;     
}
#包括“Circular.h”
#包括
使用名称空间std;
循环::循环()
{
start=NULL;
last=NULL;


CUT提示:C++中使用<代码> NulLPTR < /C> >而不是C的代码> null <代码>。为什么 main > o < /C>有这么多的依赖关系?它应该只有<代码> SRC/main .CPP < /代码>。每个文件也可以有头依赖关系,但是这可能是一个麻烦,没有自动化就可以维护。eir的完整路径,如
lib/main.o
而不是
main.o
。此
Makefile
与运行的内容不匹配。请注意build命令
g++lib/main.o lib/main.o lib/functions.o-o bin/app.exe
,其中包括
main.o
两次,并省略
循环的
。您可能还需要指定到的路径你的
.o
文件,如
lib/main.o:…
而不是
main.o:…
我还将删除所有
.o
文件,以确保你没有编译过时的资产。我删除了旧的
.o
文件,再次运行make.exe,并给出错误:
make.exe:**没有规则来确定目标`lib/main.o',app.e需要它XE'.Cal.E/Cuth>您的意思是更改<代码> O: 也到 LB/main .O/<代码>提示:在C++中使用“代码> NulLPTR < /COD>而不是C的代码> No.< /代码>。为什么 main < o >代码>有这么多的依赖关系?它应该只有<代码> SRC/main .CPP 。每个文件都可以有头依赖关系,但这可能是维护的麻烦。ain没有自动化。而且
main.exe
应该列出依赖项及其完整路径,比如
lib/main.o
,而不仅仅是
main.o
。此
Makefile
和运行的不匹配。请注意编译命令
g++lib/main.o lib/main.o lib/functions.o-o bin/app.exe
,其中包括
main.o
两次并省略
循环文件
。您可能还需要指定
.o
文件的路径,如
lib/main.o:…
,而不仅仅是
main.o:…
我还将删除所有
.o
文件,以确保您没有编译过时的资产。我删除了旧的
.o
文件,并再次运行make.exe和giv告诉我错误:
make.exe:**“app.exe”所需的目标“lib/main.o”没有规则。停止。
你的意思是将
main.o:
也更改为
lib/main.o
?我使用了完全相同的Makefile,但错误仍然相同:
c:/mingw/bin/./lib/gcc/mingw32/9.2.0/../../../../../../../mingw32/bin/ld.exe:lib main.o:main.cpp:(.text+0x20):对`Circular::Circular()的未定义引用“
它运行的是哪个
g++
命令?我希望您能够读取该输出并检查其链接是否正确。如果没有,请关注这一行。我在这一行中得到错误:
g++lib/main.o-o bin/app.exe
这不是
Makefile
运行的命令,因此您正在做一些非常奇怪的事情这里。这甚至没有引用
bin/app.exe
,所以你的终端一定有不同的东西。我使用的是windows,因为
make
在windows中不工作,所以下载了这个:并将
make.exe
复制到
Makefile
所在的项目文件中,如果你是这个意思的话,我运行它。我使用的是完全相同的Makefile,但错误保持不变:
c:/mingw/bin/./lib/gcc/mingw32/9.2.0/../../../../../../../../mingw32/bin/ld.exe:lib/main.o:main.cpp:(.text+0x20):未定义对'Circular::Circular()'的引用。
它运行了哪个
g++
命令?我希望您能够读取该输出并检查它的链接是否正确。如果没有,请关注o