我有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
答案 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.o
和Tester.o
是整个可执行文件的依赖项,它会查找提供它们的目标。查找目标,构建它们(如有必要),然后继续构建Tester
。
请注意,CFLAGS
通常表示编译标志,因此当您仅链接时不需要传递它们,因为没有编译正在进行那时候。
此外,如果您正在努力解决此类事情,请简化并删除所有其他目标(例如clean
和install
以及all
),直到您了解正在发生的事情。