-1

我有 3 个文件:MyLib.h MyLib.c Tester.c 我一直在尝试创建 makefile,但事实证明这很困难。

当它只有一个文件时,我可以做到这一点,就像下面我正在编译 Hello.c

我看过一些例子,但它们似乎比我在下面使用的要复杂得多——这对我来说很有意义。

BINDIR =    /usr/local/sbin
CC =        gcc
CFLAGS =    -O

all:        Hello

Hello:  Hello.o
    ${CC} ${CFLAGS} Hello.o ${LDFLAGS} -o Hello


Hello.o:    Hello.c
    ${CC} ${CFLAGS} -c Hello.c


install:    all
    rm -f ${BINDIR}/Hello
    cp Hello ${BINDIR}/Hello



clean:
    rm -f Hello  *.o core core.* *.core

请帮忙。

我每次打开电脑都在输入这个,现在有点烦人。

gcc MyLib.c Tester.c -o Tester
4

2 回答 2

0

假设MyLib.h是你的两个 C 文件的依赖项,你应该有这样的东西:

# Variables

CC := gcc
CFLAGS := -O


# Link executable

Tester: MyLib.o Tester.o
    ${CC} MyLib.o Tester.o ${LDFLAGS} -o Tester


# Compile object files

MyLib.o: MyLib.c MyLib.h
    ${CC} ${CFLAGS} -c -o MyLib.o MyLib.c

Tester.o: Tester.c MyLib.h
    ${CC} ${CFLAGS} -c -o Tester.o Tester.c

而且,一旦你掌握了事情的运作方式,你可以使用自动变量作为减少代码重复的第二步:

# Variables

CC := gcc
CFLAGS := -O


# Link executable

Tester: MyLib.o Tester.o
    ${CC} $^ ${LDFLAGS} -o $@


# Compile object files

MyLib.o: MyLib.c MyLib.h
    ${CC} ${CFLAGS} -c -o $@ $<

Tester.o: Tester.c MyLib.h
    ${CC} ${CFLAGS} -c -o $@ $<

其中$@被当前规则的目标名称$<替换,被第一个(即最左边的)依赖$^项替换,并被完整的依赖项列表替换。

在上面,后面的位:是依赖项,即:如果任何依赖项比目标更新,则将制作/重新制作左边的目标。对于每个依赖项,make将为它寻找一个目标。因此,对于第一部分,它会看到MyLib.o并且Tester.o是整个可执行文件的依赖项,并为它们查找提供的目标。找到目标,构建它们(如果需要),然后继续构建Tester

请注意,CFLAGS通常表示编译标志,因此在仅链接时不需要传递它们,因为此时没有进行编译。

此外,如果您正在为这类事情苦苦挣扎,请简化并删除所有额外的目标(例如cleanandinstallall),直到您掌握了正在发生的事情。

于 2013-09-22T22:50:36.047 回答
0

粗鲁但有效:

Tester:
    gcc MyLib.c Tester.c -o Tester

更好的:

CC = gcc

Tester: MyLib.o Tester.o
    $(CC) $^ -o $@

我只是猜测一下依赖关系:

MyLib.o Tester.o : MyLib.h

更复杂的 makefile 是可能的,但现在应该这样做。

于 2013-09-22T22:33:30.893 回答