我的指示是:
生成此程序所需的步骤如下:
编译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.ca.out
把它改成
cpp2html.o: cpp2html.c
        gcc -g -DDEBUG -c cpp2html.c

对编译lex.yy.clex.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文件,因此您不需要对.ocpp2html.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文件。隐式规则使用.oLEXCCLFLAGS变量来使用正确的选项运行正确的命令。我们只需要一个显式规则来构建最终的可执行文件。
这样构造makefile的好处是,您可以向项目中添加文件,而不必添加新规则。
我认为以上都是正确的,我的主箱现在已经关闭,所以我不能测试它。有关更多详细信息,请参阅Gnu Make manual

关于c - Unix:使用Make进行项目管理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31886844/

10-10 21:54