2017-03-18 112 views
0

你好我有一個鏈接到主文件的共享庫libnsd.so(由nsd.c,nsd.h,nd.c,nd.h組成)。 我的問題是如何編寫makefile,以便它僅重新編譯那些已更改的源文件。 我已經閱讀了一些關於這個主題,但有點困惑,我是一個初學者程序員。 我的makefile代碼到目前爲止:C Makefile - 僅重新編譯已更改的文件

CC=gcc 

all : lib alll 

alll : main.c 
    $(CC) main.c -o main -L. libnsd.so 

lib : nsd.c nsd.h nd.c nd.h 
    $(CC) -c -fPIC nsd.c -o nsd.o 
    $(CC) -c -fPIC nd.c -o nd.o 
    $(CC) -shared -Wl,-soname,libnsd.so -o libnsd.so nsd.o nd.o 

clean: 
    rm main libnsd.so nd.o nsd.o 
+0

您需要讓目標與您不想重新編譯的輸出文件具有相同的名稱 –

+0

(也就是說,沒有目標調用命令不會創建與目標名稱相同的文件) –

+1

你有nsd.o,nd.o,libnsd.so,主要作爲個人目標 –

回答

1

Makefiles具有構建目標的概念。構建目標實際上是所有中間文件以及最終文件,並且按照它們的編寫方式,可以使用它們來使用依賴關係。

爲你的makefile樣品溶液:

CC=gcc 

all: main 

main: main.c libnsd.so 
    $(CC) main.c -o main -L. libnsd.so 

libnsd.so: nsd.o nd.o 
    $(CC) -shared -Wl,-soname,libnsd.so -o libnsd.so [email protected] 

%.o: %.c nsd.h nd.h 
    $(CC) -c -fPIC $< -o [email protected] 

有幾件事情需要注意:

  1. 你應該適當地校正的對象文件創建我的依賴關係(因爲我認爲每一個的C文件取決於兩個頭)。
  2. 您可能希望注意我使用的通配符構造...
  3. 如果這些命令中沒有任何特別的地方,我可以使用默認命令工作。請注意,我已將第一個依賴關係用於$<,對通配符規則中的輸出使用[email protected]
  4. 我還沒有複製clean規則,因爲它在問題本身中寫入正確。

各靶(除了「假」目標all)創建一個具有相同名稱的文件:目標libnsd.so創建一個名爲libnsd.so文件。目標main創建名稱爲main的文件。

由於目標的變化日期的依賴性使得依賴性比輸出更新,所以make將重新創建目標以及依賴於目標的其他目標。但是,如果您的目標未映射到任何輸出文件,則始終調用該目標(在我們的代碼中,all目標總是被調用,但幸好它沒有命令,並且僅取決於可能需要或可能不需要的實際文件被重新創建)

請注意,GNU Make不需要特別編譯。輸出文件的創建可以通過任意的方式發生,實際上我看到一個目標創建了.cpio.gz存檔。但是,如果該存檔比任何依賴項(它將打包的文件夾)更舊,那麼將根據make重新創建它。

相關問題