C++ C++;Makefile中未定义的引用
我为一个简单的程序创建了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/
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