【问题标题】:Using Makefile in C with more than one file在 C 中使用 Makefile 与多个文件
【发布时间】:2015-05-22 16:23:54
【问题描述】:

我有 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> 写什么?

谢谢。

【问题讨论】:

  • 可以参考this

标签: c linux ubuntu makefile include


【解决方案1】:

基础知识:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    相关资源
    最近更新 更多