首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C中对多个文件使用Makefile

在C中对多个文件使用Makefile
EN

Stack Overflow用户
提问于 2015-05-23 00:23:55
回答 1查看 43关注 0票数 0

我有6个文件:

代码语言:javascript
复制
guiGame.c, which include guiGame.h
guiGame.h, include minimax.h,listutils.h
minimax.c, include minimax.h
minimax.h, include listutils.h 
listutils.c, include listutils.h

我是在Visual Studio中构建的,我需要在Linux上运行它。我试图搜索如何为他们构建makefile,但我没有成功地构建一些有用的东西;有一些包含的东西永远不会对我起作用。

有人能告诉我在每一行X:<files>中需要写些什么吗?

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2015-05-25 07:38:15

基础知识:

代码语言:javascript
复制
SRCS = guiGame.c minimax.c listutils.c
HDRS = guiGame.h minimax.h listutils.h

PROG = guiGame
OBJS = ${SRCS:.c=.o}

DEBRIS = a.out core *~
RM_F   = rm -f

all: ${PROG}

${PROG}: ${OBJS}
    ${CC} -o $@ ${CFLAGS} ${OBJS} ${LDFLAGS} ${LDLIBS}

clean:
    ${RM_F} ${OBJS} ${PROG} ${DEBRIS}

遗留的问题是如何正确地处理依赖关系。目标文件依赖于它们包含的头文件。悲观但简单的版本是:

代码语言:javascript
复制
${OBJS}: ${HDRS}

它可以工作,但这意味着如果您更改guiGame.hlistutils.o将被重新编译,否则它不需要重新编译。

有各种工具可以自动处理依赖项。mkdepmkdepend是两个;您还可以研究gcc的选项。

请注意,命令行(以${CC}${RM_F}开头)用制表符缩进,而不是空格。这一点至关重要。

变量LDFLAGS主要用于指定库的位置。变量LDLIBS允许您指定库。在命令行中,目标文件放在库文件之前;库标志可以放在任何地方。

我通常从不同的部分构建CFLAGS

代码语言:javascript
复制
WFLAG1 = -Wall
WFLAG2 = -Wextra
WFLAG3 = -Wmissing-prototypes
WFLAG4 = -Wstrict-prototypes
WFLAG5 = -Wold-style-definition
WFLAG6 = -Werror
WFLAGS = ${WFLAG1} ${WFLAG2} ${WFLAG3} ${WFLAG4} ${WFLAG5} ${WFLAG6}
SFLAGS = -std=c11
GFLAGS = -g
OFLAGS = -O3
UFLAGS = # Set on command line
IFLAG1 = -I${HOME}/inc
IFLAGS = ${IFLAG1}

CFLAGS  = ${OFLAGS} ${GFLAGS} ${IFLAGS} ${SFLAGS} ${WFLAGS} ${UFLAGS}

这允许我在make命令行上调整任何选项。大多数人都不那么挑剔(小心?)。请注意,GFLAGS过去用于SCCS get命令的标志-您可能会通过回收来搞砸一些东西,但您可能不会这样做。

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

https://stackoverflow.com/questions/30401612

复制
相关文章

相似问题

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