使用Makefile在不同目录下编译C程序

时间:2015-02-23 07:41:01

标签: c linux makefile

我对编译在不同源文件夹下分发的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来编译和链接不同目录中的源以创建可执行文件?

3 个答案:

答案 0 :(得分:1)

您可以在Makefile中列出所有源文件的路径:

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

答案 1 :(得分:0)

这是您可以使用的基本makefile示例。 建议使用Clean删除已编译的可执行文件

 # ------------------------------------------------
 # Generic Makefile
 #
 # Author: yanick.rochon@gmail.com
 # 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!"

这将编译具有特定文件扩展名的目录中的所有文件。

PS:如果您将文件命名为“makefile”,则执行该文件所需要做的就是在linux终端上写“ ./ make ”提示。

答案 2 :(得分: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