【发布时间】:2020-12-03 14:05:06
【问题描述】:
我为一个简单的程序创建了我的 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 的简短 sn-p:
#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;
}
Circular.h:
#include "node.h"
class Circular
{
public:
Circular();
node *start;
node *last;
int counter;
}
Circular.cpp:
#include "../include/Circular.h"
#include <iostream>
using namespace std;
Circular::Circular()
{
start = NULL;
last = NULL;
}
和node.h:
struct node
{
int data;
struct node *next;
struct node *prev;
};
我知道问题在于链接器和 Makefile,但即使我尝试了不同的可能解决方案,但不知何故它不起作用。因此,也许有人可以看到我正在犯的错误。谢谢!
【问题讨论】:
-
提示:在 C++ 中使用
nullptr而不是 C 的NULL。 -
为什么
main.o有这么多依赖?它应该只有src/main.cpp。每个文件可以也有头文件依赖,但是如果没有自动化,维护起来会很麻烦。此外,main.exe应该列出依赖项及其完整路径,例如lib/main.o而不仅仅是main.o。 -
这个
Makefile和正在运行的不匹配。请注意构建命令g++ lib/main.o lib/main.o lib/functions.o -o bin/app.exe,其中包含main.o两次并省略Circular。 -
您可能还需要指定
.o文件的路径,例如lib/main.o: ...而不仅仅是main.o: ...我还要删除所有.o文件以确保您没有编译陈旧资产。 -
我删除了旧的
.o文件并再次运行 make.exe 并给我错误:make.exe: *** No rule to make target `lib/main.o', needed by `app.exe'. Stop.你的意思是将main.o:也更改为lib/main.o?