要編譯兩個文件,我已經創建了一個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
的可執行文件上創建。
編輯:---
@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$
或'$(殼找到-name「的* .c」)' – keltar
感謝:用
$(OBJ)
作爲依賴創建目標,並使用自動變量,就像你做編譯回答--- OBJ:= $(patsubst%.c,%。o,$(通配符*/*。c)) - 因此,如果我按照您的建議更改OBJ,那麼它會從當前目錄和子目錄-directories ..? ..還有* .o爲每個文件將在其各自的文件夾或主文件夾中創建? – Katoch還有一個問題---在這種情況下,我的乾淨目標收件人是否正確? – Katoch