在C中使用带有多个文件的Makefile

时间:2015-05-22 16:23:55

标签: c linux ubuntu makefile include

我有6个文件:

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>行需要写什么吗?

感谢。

1 个答案:

答案 0 :(得分:0)

基础知识:

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}

剩下的问题是让依赖关系正确。目标文件取决于它们包含的标头。悲观但简单的版本是:

${OBJS}: ${HDRS}

可行,但这意味着如果您更改guiGame.h,则会在不需要时重新编译listutils.o

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

请注意,命令行(起始${CC}${RM_F})由制表符缩进,而不是空格。这很重要。

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

我通常会从各个部分构建CFLAGS

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命令的标志 - 您可能通过回收它来搞砸了,但您可能不会。