Makefile C Ubuntu - 遇到问题

时间:2013-09-22 21:06:22

标签: makefile

我有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

2 个答案:

答案 0 :(得分: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是可能的,但现在应该这样做。

答案 1 :(得分: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.oTester.o是整个可执行文件的依赖项,它会查找提供它们的目标。查找目标,构建它们(如有必要),然后继续构建Tester

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

此外,如果您正在努力解决此类事情,请简化并删除所有其他目标(例如cleaninstall以及all),直到您了解正在发生的事情。