我有3个文件:Triliza.h,Triliza.cpp和Game.cpp。 这是我的makefile
CC = g++
prog: Game.o
$(CC) Game.o -Wall -Werror -pedantic -o Triliza
Game.o: Game.cpp Triliza.h
$(CC) -Wall -Werror -pedantic -c Game.cpp
Triliza.o: Triliza.cpp Triliza.h
$(CC) -Wall -Werror -pedantic -c Triliza.cpp
这是我的主要文件:Game.cpp
#include <iostream>
using namespace std;
#include "Triliza.h"
Triliza *triliza;
int main(int argc, char* argv[])
{
while (1)
{
triliza = new Triliza();
triliza->verifyFirstPlayer();
triliza->loop();
if (!triliza->playAgain())
break;
}
return 0;
}
输出错误:
g++ Game.o -Wall -Werror -pedantic -o Triliza
Undefined symbols:
"Triliza::Triliza()", referenced from:
_main in Game.o
"Triliza::verifyFirstPlayer()", referenced from:
_main in Game.o
"Triliza::loop()", referenced from:
_main in Game.o
"Triliza::playAgain()", referenced from:
_main in Game.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
make: *** [prog] Error 1
所以我想当我尝试将每个文件一起导入时出现问题。谁能指出我正确的方法。感谢
编辑:更改后出现另一个错误。
make: *** No rule to make target `Trizilla.o', needed by `prog'. Stop.
感谢所有回复。我知道了。因为Triliza有拼写错误
答案 0 :(得分:3)
实际上你的make文件可以像这样简单(每个只有两行):
CXXFLAGS:=-Wall -Werror -pedantic
prog: Game.cpp Triliza.cpp
虽然你可能想要这个:
CXXFLAGS:=-Wall -Werror -pedantic
Triliza: Game.cpp Triliza.cpp
尽管在这两种情况下都不会明确地考虑(更改的)头文件。
CXX
将使用GNU make的内置规则自动编译.cpp
个文件。执行以下操作以查看内置规则和目标:
make -np -f /dev/null
(小写-f
在编辑前确实有大写字母)
现在让我们假设头文件的依赖关系也是相关的。在这种情况下,我将调整我的第二个示例以形成以下(完整)make文件:
CXXFLAGS:=-Wall -Werror -pedantic
Triliza: Game.cpp Triliza.cpp
dependencies: Game.cpp Triliza.cpp
$(CXX) -M $(CXXFLAGS) $^ > $@
include dependencies
只有在$(CXX)
明白-M
时才有效。 GCC会这样做(无论是gcc
还是g++
)。
答案 1 :(得分:2)
由于依赖性问题,在构建可执行文件时,您没有在Triliza.o中进行链接。更改prog目标,如下所示:
prog: Game.o Triliza.o
$(CC) Game.o Triliza.o -Wall -Werror -pedantic -o Triliza
答案 2 :(得分:0)
问题在于prog
不依赖于Triliza.o
。 Game.o
prog: Game.o Triliza.o
$(CC) -Wall -Werror -pedantic -o Triliza $^
这应该这样做。
$^
将依赖项扩展到以空格分隔的列表中。