我的指示是:
生成此程序所需的步骤如下:
编译CPP2HTML.C以产生CPP2HTML.O(重要的是:这个项目中的源代码是C,而不是C++,因此必须编译并与GCC连接,而不是G++)。
运行命令
挠性CPPScanner.l
从cppscanner.l中的语言描述生成文件lex.yy.c。
编译lex.yy.c以生成lex.yy.o。(这通常会生成有关额外令牌的警告消息。忽略它。)
链接.o文件以生成名为cpp2html的可执行程序
编写一个执行这些步骤的makefile。当更改此进程的任何输入文件时,makefile只应导致所需的最少步骤数。(注意:您可能无法将此生成文件建立在我的自我更新生成文件的基础上,如分配的前一部分所述)。相反,你可能会发现有必要从头开始写这篇文章。
这是我的makefile:
cpp2html: cpp2html.o lex.yy.o
gcc -g -DDEBUG cpp2html.o lex.yy.o
mv a.out cpp2html
lex.yy.o: lex.yy.c
gcc -g -DDEBUG lex.yy.c
lex.yy.c:
flex cppscanner.l
cpp2html.o: cpp2html.c
gcc -g -DDEBUG cpp2html.c
我在这里做错什么了?我收到一条错误消息说:
错误:LD返回1退出状态
make:**[cpp2html.o]错误1
调用时,生成文件不会生成“cpp2html”:
g c c-g-ddebug cpp2html.c
今晚就要交了,如果有什么建议,我们将不胜感激。
最佳答案
它抱怨的是:
cpp2html.o: cpp2html.c
gcc -g -DDEBUG cpp2html.c
这一行试图编译
cpp2html.c
到a.out
。把它改成
cpp2html.o: cpp2html.c
gcc -g -DDEBUG -c cpp2html.c
对编译
lex.yy.c
到lex.yy.o
的行执行相同的操作。-c
选项告诉gcc
只生成对象文件并将其写入.o
文件。您可以利用其他选项和一些内置变量。这里有个建议:
cpp2html: cpp2html.o lex.yy.o
gcc -g -DDEBUG -o $@ $?
$@
计算为目标的名称。$?
计算为依赖项列表(文件)。.o
选项告诉-o
将生成的二进制文件写入指定的文件名,而不是gcc
。您还可以利用隐式规则:
%.o : %.c
gcc -g -DDEBUG -c $<
这将把任何
a.out
文件构建到相应的.c
文件,因此您不需要对.o
和cpp2html.c
重复相同的命令。编辑
fwiw,下面是我如何构造makefile(带有注释;假设是gnu make):
# Variables used by implicit rules
CFLAGS=-g -DDEBUG -Wall -Werror # flags for gcc
LFLAGS= # flags for flex, currently none
LEX=flex # lexer
CC=gcc # C compiler
# Variables to make life easier
LSRCS=cppscanner.l # All of our flex source files
SRCS=cpp2html.c $(patsubst %.l,%.c,${LSRCS}) # All of our C source files
OBJS=$(patsubst %.c,%.o,${SRCS}) # All of our object files
TARGET=cpp2html # Final target name
${TARGET} : ${OBJS}
${CC} ${CFLAGS} -o $@ $^ # Explicit rule to build target
# $@ expands to target name
# $^ expands to list of all prerequisites
clean:
rm -rf *.o $(patsubst %.l,%.c,${LSRCS})
就这样。我们依赖隐式规则将
lex.yy.c
文件构建为.l
文件,并将.c
文件构建为.c
文件。隐式规则使用.o
、LEX
、CC
和LFLAGS
变量来使用正确的选项运行正确的命令。我们只需要一个显式规则来构建最终的可执行文件。这样构造makefile的好处是,您可以向项目中添加文件,而不必添加新规则。
我认为以上都是正确的,我的主箱现在已经关闭,所以我不能测试它。有关更多详细信息,请参阅Gnu Make manual。
关于c - Unix:使用Make进行项目管理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31886844/