2013-09-22 36 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可能,但現在應該這樣做。