2013-10-23 55 views
2

要編譯兩個文件,我已經創建了一個makefile,用於提及對象名稱,或者我可以使用patsubst使用模式規則。用於編譯 - 項目中的文件夾和子文件夾中的所有* .c文件

# ---------------------------------------------------------------------------- 
# Makefile for building tapp 
# 
# Copyright 2010 FriendlyARM (http://www.arm9.net/) 
# 

ifndef DESTDIR 
DESTDIR   ?= /opt/FriendlyARM/tiny6410/linux/rootfs_qtopia_qt4 
endif 

#CFLAGS    = -c -Wall -O2 # wall is for warning show and 02 is optiminisation level 2 
CFLAGS    = -c -O2 # wall is for warning show and 02 is optiminisation level 2 
#CC     = arm-linux-gcc # compiler name 
CC     = gcc # compiler name 
LD     = ld 

INSTALL    = install   # 

TARGET    = led_player_project 

#OBJ = led-player_backup.o led-player.o 
OBJ := $(patsubst %.c,%.o,$(wildcard *.c */*.c)) 

#OBJ = $(shell find . -name '*.c') 

all: $(TARGET) 
#all: $(OBJ) 

led_player_project : $(OBJ) 
    $(LD) $(LDFLAGS) -o [email protected] $(OBJ) $(LIBS) 
#  $(LD) $(LDFLAGS) -o [email protected] $< $(LIBS) 

%.o : %.c 
    $(CC) $(CFLAGS) $< -o [email protected] 

#$< -o [email protected] 


install: $(TARGET) 
    $(INSTALL) $^ $(DESTDIR)/usr/bin 

clean : 
    rm -rf *.o $(TARGET) $(OBJ) 


# ---------------------------------------------------------------------------- 

.PHONY: $(PHONY) install clean 

# End of file 
# vim: syntax=make 

#EOF 

現在,如果我的項目中包含的文件夾包含子文件夾&它們包含更多的文件。那我可不可以寫模式規則來編譯每個文件&創建一個通用的可執行文件?

1>我是否必須在每個子文件夾中創建makefile,以便我可以從主makefile調用makefile,例如將靜態驅動程序集成到linux內核,每個驅動程序都有相應的makefile?
2>或完整項目的通用makefile?
3>我可以使用patsubst來編譯每個文件,而不必提及名稱。
4>如何組合每個* .o以在名爲main的可執行文件上創建。

enter image description here

編輯:---
@Jan鄔達克 我已經修改了我的makefile,按您的評論(我已張貼上面)。現在我只是想在我的主文件夾中使用兩個文件夾。我收到以下錯誤 文件夾結構: -

main Folder ----> one Folder 
      ----> two Folder 

文件夾主要包括: -

main.c 
main.h 
Makefile 

一個文件夾包含: -

one.c 
one.h 

文件夾2包括: -

two.c 
two.h 

的main.c內容: -

#include <stdio.h> 
#include <stdlib.h> 

#include "main.h" 

int main() 
{ 
    char *p; 

    printf("\n\n main \n"); 

    one(); 
    two(); 

    return 0; 
} 

main.h內容:---

#include "one/one.h" 
#include "two/two.h" 

one.c內容:---

#include <stdio.h> 
    #include <stdlib.h> 

#include "one.h" 

    void one() 
    { 

     printf("\n one \n"); 

    } 

one.h內容: ---

void one(); 

two.c content:---

#include <stdio.h> 
#include <stdlib.h> 

#include "two.h" 

void two() 
{ 

    printf("\n two \n"); 

} 

two.h內容:---

void two(); 

錯誤,我得到的化妝時間:----

[email protected]:~/testing/main$ make 
gcc -c -O2 main.c -o main.o 
gcc -c -O2 one/one.c -o one/one.o 
gcc -c -O2 two/two.c -o two/two.o 
ld -o led_player_project main.o one/one.o two/two.o 
ld: warning: cannot find entry symbol _start; defaulting to 0000000008048080 
main.o: In function `main': 
main.c:(.text.startup+0x11): undefined reference to `puts' 
one/one.o: In function `one': 
one.c:(.text+0xb): undefined reference to `puts' 
two/two.o: In function `two': 
two.c:(.text+0xb): undefined reference to `puts' 
make: *** [led_player_project] Error 1 
[email protected]:~/testing/main$ 

回答

4

廣告1和2:文件名可以安全地包括目錄並根據需要%匹配/。所以,你可以輕鬆擁有:

$(wildcard subdir/*.c) $(wildcard anotherdir/*.c) 

甚至

$(wildcard */*.c) 

...或由keltar在評論

$(shell find . -name '*.c') 

這是遞歸的建議。

廣告3:你在做。

廣告4:

main : $(OBJ) 
     $(LD) $(LDFLAGS) -o [email protected] $< $(LIBS) 
+2

或'$(殼找到-name「的* .c」)' – keltar

+0

感謝:用$(OBJ)作爲依賴創建目標,並使用自動變量,就像你做編譯回答--- OBJ:= $(patsubst%.c,%。o,$(通配符*/*。c)) - 因此,如果我按照您的建議更改OBJ,那麼它會從當前目錄和子目錄-directories ..? ..還有* .o爲每個文件將在其各自的文件夾或主文件夾中創建? – Katoch

+0

還有一個問題---在這種情況下,我的乾淨目標收件人是否正確? – Katoch

相關問題