用于c程序的makefile(在knoppix上)

时间:2017-06-18 21:20:52

标签: c linux makefile

我目前正在尝试使用makefile在c代码中编译程序,该程序在visual studio中的窗口上编译很好,我当然打算让它在我的类环境中工作(我们使用knoppix)

我使用指南创建了一个makefile,这是输出:

knoppix@Microknoppix:~/Desktop/projfinal$ make
gcc -c main.c
make: Warning: File `q1.c' has modification time 8.2e+03 s in the future
gcc -c q1.c
gcc -c q2.c
gcc -c q3.c
gcc -c q4.c
gcc -c q5.c
gcc -c q6.c
gcc -c q7.c
gcc -o main.o q1.o q2.o q3.o q4.o q5.o q6.o q7.o
/usr/lib/gcc/i486-linux-gnu/4.7/../../../i386-linux-gnu/crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
collect2: error: ld returned 1 exit status
make: *** [runProject] Error 1

但是我确实将包含main的文件添加到makefile进行编译,这是我的makefile:

runProject: main.o q1.o q2.o q3.o q4.o q5.o q6.o q7.o
    gcc -o main.o q1.o q2.o q3.o q4.o q5.o q6.o q7.o

main.o: main.c projectHeader.h
    gcc -c main.c

q1.o: q1.c projectHeader.h
    gcc -c q1.c

q2.o: q2.c projectHeader.h
    gcc -c q2.c

q3.o: q3.c projectHeader.h
    gcc -c q3.c

q4.o: q4.c projectHeader.h
    gcc -c q4.c

q5.o: q5.c projectHeader.h
    gcc -c q5.c

q6.o: q6.c projectHeader.h
    gcc -c q6.c

q7.o: q7.c projectHeader.h
    gcc -c q7.c

clean: 
    rm runProject main.o q1.o q2.o q3.o q4.o q5.o q6.o q7.o

任何帮助或见解将不胜感激:)

1 个答案:

答案 0 :(得分:0)

要回答当前的问题,这条规则是错误的:

runProject: main.o q1.o q2.o q3.o q4.o q5.o q6.o q7.o
    gcc -o main.o q1.o q2.o q3.o q4.o q5.o q6.o q7.o

gcc的-o选项设置输出文件,因此您不是在此处与main.o链接,而是尝试链接名为 main.o的可执行文件来自所有其他目标文件。其他任何目标文件都不包含main(),这解释了您获得的链接器错误。快速解决方法是:

runProject: main.o q1.o q2.o q3.o q4.o q5.o q6.o q7.o
    gcc -o runProject main.o q1.o q2.o q3.o q4.o q5.o q6.o q7.o

这将创建名为runProject的可执行文件。

但是还有很多需要改进的地方。 make规则的目标通常应该是由该规则创建的文件。在规则内部,您可以使用自动变量:目标为$@,第一个为$<$^。所有先决条件(冒号后的文件,创建输出所需的文件)。

GNU make还支持模式规则,使用%作为模式匹配的通配符,因此根本不需要一遍又一遍地编写相同的规则。

最后,应该声明不是创建文件名称的目标.PHONY。有关详细信息,请阅读GNU make manual

建议的Makefile:

all: runProject

runProject: main.o q1.o q2.o q3.o q4.o q5.o q6.o q7.o
    gcc -o$@ $^

%.o: %.c projectHeader.h
    gcc -c -o$@ $<

clean: 
    rm -f runProject main.o q1.o q2.o q3.o q4.o q5.o q6.o q7.o

.PHONY: all clean