首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么不让make在第一次运行时构建一个对象文件?

为什么不让make在第一次运行时构建一个对象文件?
EN

Stack Overflow用户
提问于 2013-01-25 15:17:41
回答 1查看 126关注 0票数 2

我有this Makefile

代码语言:javascript
复制
CFLAGS := $(CFLAGS) -std=c99

shell: main.o shellparser.o shellscanner.o
    $(CC) -o shell main.o shellparser.o shellscanner.o

main.o: main.c shellparser.h shellscanner.h

shellparser.o: shellparser.h

shellparser.h: shellparser.y lemon
    ./lemon shellparser.y

shellscanner.o: shellscanner.h

shellscanner.h: shellscanner.l
    flex --outfile=shellscanner.c --header-file=shellscanner.h shellscanner.l

# Prevent yacc from trying to build parsers.
# http://stackoverflow.com/a/5395195/79202
%.c: %.y

lemon: lemon.c
    $(CC) -o lemon lemon.c

由于某些原因,在第一次运行make时,没有构建shellparser.o

代码语言:javascript
复制
> make
cc -o lemon lemon.c
./lemon shellparser.y
flex --outfile=shellscanner.c --header-file=shellscanner.h shellscanner.l
cc  -std=c99   -c -o main.o main.c
cc  -std=c99   -c -o shellscanner.o shellscanner.c
cc -o shell main.o shellparser.o shellscanner.o
i686-apple-darwin10-gcc-4.2.1: shellparser.o: No such file or directory
make: *** [shell] Error 1
rm shellscanner.c

如果我再次运行它,它会正确地构建它:

代码语言:javascript
复制
> make
cc  -std=c99   -c -o shellparser.o shellparser.c
cc -o shell main.o shellparser.o shellscanner.o

那么,我有什么乱七八糟的东西,以至于它不会在第一次构建它?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-25 15:28:13

第一次尝试构建时,Make并不知道lemon会输出shellparser.c,因此它不会尝试构建它。当您重新构建时,shellparser.c确实存在,因此Make使用它。解决方案是显式地告诉Make lemon输出为shellparser.c

代码语言:javascript
复制
diff --git a/Makefile b/Makefile
index bf2655e..d6b288d 100644
--- a/Makefile
+++ b/Makefile
@@ -7,7 +7,7 @@ main.o: main.c shellparser.h shellscanner.h

 shellparser.o: shellparser.h

-shellparser.h: shellparser.y lemon
+shellparser.c shellparser.h: shellparser.y lemon
        ./lemon shellparser.y

 shellscanner.o: shellscanner.h
diff --git a/main.c b/main.c
index 81ec151..4179981 100644
--- a/main.c
+++ b/main.c
@@ -33,7 +33,7 @@ void parse(const char *commandLine) {
 }

 // Borrowed from http://stackoverflow.com/a/314422/79202.
-char * getline(void) {
+char * my_getline(void) {
     char * line = malloc(100), * linep = line;
     size_t lenmax = 100, len = lenmax;
     int c;
@@ -69,7 +69,7 @@ int main(int argc, char** argv) {
     void* shellParser = ParseAlloc(malloc);
     char *line;
     printf("> ");
-    while ( line = getline() ) {
+    while ( line = my_getline() ) {
         parse(line);
         printf("> ");
     }

另外,我重命名了getline,这样它就可以构建在我的苹果电脑上了;感谢你贴出你的所有源代码!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14517147

复制
相关文章

相似问题

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