如何使用.h文件和main.cpp为几个.cpp文件创建一个makefile而不使用.h

时间:2014-10-10 05:09:32

标签: c++ makefile

我有:

main.cpp 
distance.cpp
distance.h
adjacencyList.cpp
adjacencyList.h

这是我的makefile:

all: distance main adjacencyList
    g++ distance.o main.o adjacencyList.o

main.o: main.cpp
    g++ main.cpp -lstdc++

adjacencyList.o: adjacencyList.cpp
    g++ adjacencyList.cpp -lstdc++

distance.o: distance.cpp
    g++ distance.cpp -lstdc++

clean:
    rm -rf *.o all

我收到此错误。所以我很确定我在使用main时出错了,因为它不是像其他两个类那样的类,并且没有.h文件。

enter image description here

更新

在尝试了Ben Voigt的解决方案后,我收到了1个错误:

enter image description here

2 个答案:

答案 0 :(得分:1)

创建目标文件的规则缺少-c选项,对于"仅编译"。所以他们试图链接,并因为没有main()而失败。

然后,您的all目标为每个编译单元命名可执行文件。再次,这是错误的,因为他们都没有main()。您应该只有一个可执行文件。 all也应该配置为虚假目标,因为它不会构建名为all的实际文件。

您的所有规则都无法控制输出文件的名称。

您的所有规则都无法通过标记。

您的规则缺少对标头的依赖性,因此编辑标头不会导致重新编译正确的文件。

真的,你应该摆脱编译和链接规则,让make使用它的内置规则。专注于您的构建目标和依赖关系。

你的结束makefile看起来应该是这样的(当然,使用空格而不是制表符)

all : main

.PHONY : all clean

CC = g++
LD = g++

main : main.o adjacencyList.o distance.o

main.o: main.cpp adjacencyList.h distance.h

adjacencyList.o: adjacencyList.cpp adjacencyList.h

distance.o: distance.cpp distance.h

clean:
    rm -rf *.o main

答案 1 :(得分:0)

狂野猜测:在包含adjacencyList.h之前,你可能会遗漏某个分号。 检查每个头文件并确保使用分号

正确终止每个类定义