2015-02-23 71 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