2013-09-22 33 views
-1

我有3个文件:MyLib.h MyLib.c Tester.c 我一直在尝试创建makefile,但它证明很困难。Makefile C Ubuntu - 有问题

我能做到这一点时,它只有一个文件,如下面我在哪里编译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

目的是什么?创建一个库,然后将测试仪链接到那个?或者只是使用Mylib [ch]和Tester.c创建一个二进制文件? –

+0

它会基本上这样做:gcc MyLib.c Tester.c -o Tester –

回答

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 [email protected] 


# Compile object files 

MyLib.o: MyLib.c MyLib.h 
    ${CC} ${CFLAGS} -c -o [email protected] $< 

Tester.o: Tester.c MyLib.h 
    ${CC} ${CFLAGS} -c -o [email protected] $< 

其中[email protected]是替换为目标的当前规则的名称,$<由第一(即最左)依赖性,和替代被完整的依赖关系列表所取代。

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

注意CFLAGS常规代表编译标志,所以你并不需要通过他们,当你只因为没有编译在这一点上正在做。另外,如果你正在为这种事情而苦恼,那么简化并删除所有额外的目标(例如cleaninstallall),直到你掌握了正在发生的事情。

0

原油,但有效:

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

更好:

CC = gcc 

Tester: MyLib.o Tester.o 
    $(CC) $^ -o [email protected] 

而我只是做一个关于依赖猜测:

MyLib.o Tester.o : MyLib.h 

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