2015-02-23 75 views
1

我對編譯分佈在不同源文件夾下的C代碼有疑問。 我的項目結構如下使用Makefiles在不同目錄下編譯C程序

root directory---> Project 
sub-directory--> include => add.h sub.h 
sub-directory--> source => add.c sub.c 
sub-directory--> src => main.c crc.c spi.c 

如何編寫一個簡單的makefile編譯並在不同的目錄鏈接來源,以創建一個可執行文件?

+1

只是一個合乎邏輯的問:「src」和「source」是單獨目錄的目的是什麼? – 2015-02-23 07:44:49

+0

這很簡單。你有什麼嘗試,它是如何失敗? – tripleee 2015-02-23 07:55:27

回答

0

這是您可以使用的一個基本的makefile示例。 清潔建議刪除編譯的可執行文件

# ------------------------------------------------ 
# Generic Makefile 
# 
# Author: [email protected] 
# Date : 2010-11-05 
# 
# Changelog : 
# 0.01 - first version 
# ------------------------------------------------ 

# project name (generate executable with this name) 
TARGET = projectname 

CC  = gcc -std=c99 -c 
# compiling flags here 
CFLAGS = -Wall -I. 

LINKER = gcc -o 
# linking flags here 
LFLAGS = -Wall 

SOURCES := $(wildcard *.c) 
INCLUDES := $(wildcard *.h) 
OBJECTS := $(SOURCES:.c=*.o) 
rm  = rm -f 

$(TARGET): obj 
@$(LINKER) $(TARGET) $(LFLAGS) $(OBJECTS) 
@echo "Linking complete!" 

obj: $(SOURCES) $(INCLUDES) 
@$(CC) $(CFLAGS) $(SOURCES) 
@echo "Compilation complete!" 

clean: 
     @$(rm) $(TARGET) $(OBJECTS) 
     @echo "Cleanup complete!" 

這將彙編目錄中的所有文件與特定的文件擴展名。

P.S:如果命名文件「的Makefile」,所有你需要做的要執行的文件是寫「./make」在Linux終端提示。

+0

它不適用於子目錄中的源代碼。 – 2015-02-23 08:06:08

0

看來,你將不得不在每個子目錄中放置一個單獨的makefile,並從根目錄開始每次遞歸調用一次。 Gnu在此提到遞歸makefile:https://www.gnu.org/software/make/manual/html_node/Recursion.html

但是,有可能有理由不這樣做。一些具體的例子是 這裏提到: http://miller.emu.id.au/pmiller/books/rmch/

您也可以選擇將路徑硬編碼到你的makefile這樣的用戶做了: Makefile: Compiling from directory to another directory

+0

@ el.pescado:您的網址出現在問題中 – 2015-02-23 10:28:13

1

你可以只列出路徑在Makefile中的所有源文件:

SOURCES=\ 
    src/main.c \ 
    src/crc.c \ 
    src/spi.c \ 
    sources/add.c \ 
    sources/sub.c