首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C程序的makefile (在knoppix上)

C程序的makefile (在knoppix上)
EN

Stack Overflow用户
提问于 2017-06-18 21:20:52
回答 1查看 85关注 0票数 0

目前,我正在尝试使用makefile编译c++代码,该程序在visual studio中的windows上运行良好,当然,我打算使它在我的类环境中工作(我们使用knoppix)。

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

代码语言:javascript
复制
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

但是,我确实将包含主文件的文件添加到makefile以进行编译,下面是我的makefile:

代码语言:javascript
复制
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

如有任何协助或见解,将不胜感激:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-19 07:21:53

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

代码语言:javascript
复制
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(),这解释了您得到的链接器错误。一个快速的解决办法是:

代码语言:javascript
复制
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规则的目标通常应该是由该规则创建的文件。在规则中,您有可用的自动变量:$@用于目标,$<$^用于第一个resp。创建输出所需的所有先决条件(冒号后面的文件)。

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

最后,不属于已创建文件名称的目标应该声明为.PHONY。有关详细信息,请阅读GNU制作手册

建议的Makefile:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44619642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档