编写多文件,多目录makefile(借鉴网上的一篇文章来自己练手)

(1)首先makefile文件的一些(红色字体是比较常用的)

预定义变量含义

  $*  不包含扩展名的目标文件名称。
  $+   所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件。
  $<   第一个依赖文件的名称。
  $?   所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚。
  $@  目标的完整名称。
  $^    所有的依赖文件,以空格分开,不包含重复的依赖文件。
  $%    如果目标是归档成员,则该变量表示目标的归档成员名称。例如,如果目标名称为   (image.o),则 $@ 为 ,而 $% 为 image.o。
  AR   归档维护程序的名称,默认值为 ar。
  ARFLAGS   归档维护程序的选项。

  AS  汇编程序的名称,默认值为 as。

  ASFLAGS  汇编程序的选项。

  CC C 编译器的名称,默认值为 cc。


  CFLAGS  C 编译器的选项。


  CPP    C 预编译器的名称,默认值为 $(CC) -E。

  CPPFLAGS     C 预编译的选项。
  CXX   C++ 编译器的名称,默认值为 g++。
  CXXFLAGS  C++ 编译器的选项。
  FC   FORTRAN 编译器的名称,默认值为 f77。
  FFLAGS    FORTRAN 编译器的选项。

(2)makefile文件详细资料 http://download.csdn.net/detail/rayzongx/4459237

点击打开链接

 

(3)例子:

|-->main.c
|-->example.c
|-->Makefile            
|-->foo------->|-->common.c
                     |-->foo.c
                     |-->Makefile


|-->bar------ >|-->bar.c
                     |-->common.c

                     |-->Makefile


|-->configs->|-->foo.h
                    |-->bar.h

(这是练习网上的一份多目录多文件的makefile文件的编写,有所删减)

bar目录下:

//bar.c文件

#include <stdio.h>
void  bar(int i)
{
printf("hell from %s() in file:%s,num:%d\n",__func__,__FILE__,i);
}
int hello_bar(void)
{
printf("in func:%s()\n",__func__);
foo(200);
common_bar();
printf("===============================\n");
return 0;
}

//common.c 文件

#include <stdio.h>
int common_bar(void)
{
printf("this is a common function in bar/common.c\n");
return 0;
}


对应的头文件bar.h(在configs目录下)
#ifndef BAR_H_
#define BAR_H_
void bar(int i);
int hello_bar(void);
#endif


foo目录下:

foo.c的代码

#include<stdio.h>
void foo(int i)
{
printf("hell form %s() in file %s,num:%d\n",__func__,__FILE__,i);
}
int hello_foo(void)
{
printf("in func:%s()\n",__func__);
bar(100);
common_foo();
printf("=================================\n");
return 0;
}

common.c的代码

#include <stdio.h>
int  common_foo(void)
{
printf("this is a common function in foo/common.c\n");
return 0;
}

对应的头文件foo.h(在configs目录下)

#ifndef __FOO_H__
#define __FOO_H__
void foo(int i);
int  hello_foo(void);
#endif /* end of include guard: __FOO_H__ */

Makefile文件:

(1)顶层目录的Makefile文件

jC=gcc 
CFLAGS=-Wall
DEBUG=y
ifeq ($(DEBUG),y)
CFLAGS +=-g
else
CFLAGS +=-O2
endif
SUBDIRS :=foo bar
LIBS :=foo/foo.a bar/bar.a
LDFLAGS=$(LIBS)
RM=-rm -rf


__OBJS=main.o
__OBJS+=example.o
__SRCS=$(subst .o,.c,$(__OBJS))
__LIBLINK=./configs/
target=a.out
MAKE=make
all:$(target)
$(__OBJS):$(__SRCS)
$(CC) $(CFLAGS) -c $^  -I $(__LIBLINK)
$(target):$(__OBJS)
for dir in $(SUBDIRS);\
do $(MAKE) -C $$dir all ||exit 1;\
done
$(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS)
clean:
@for dir in $(SUBDIRS);\
do make -C $$dir clean ||exit 1;\
done
$(RM) $(__OBJS) $(target) *.bak*~
.PHONY:all clean

(2)bar目录下的makefile文件

AR=ar
ARFLAGS=cr
LIB=bar.a
RM=-rm -rf
OBJS:=bar.o common.o
all:$(LIB)
$(LIB):$(OBJS)
$(AR) $(ARFLAGS) $@ $(OBJS)
clean:
$(RM) $(OBJS) $(LIB) *.bak*~
.PHONY:all clean

(3)foo目录下的makefile文件

AR=ar
ARFLAGS=cr
LIB=foo.a
RM=-rm -rf
OBJS:=foo.o common.o
all:$(LIB)
$(LIB):$(OBJS)
$(AR) $(ARFLAGS) $@ $(OBJS)
clean:
$(RM) $(OBJS) $(LIB) *.bak*~
.PHONY:all clean



最后总结:发这篇博文完全是为了移动复习之前的知识点,没有其他意思,当然若能对别人makefile的学习有点帮助那我更是欣喜不已。另外感谢网上有这么多的好资源。












  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当在VSCode中编写一个多文件的C语言项目,并使用Makefile进行编译和构建时,可以按照以下步骤进行操作: 1. 创建项目文件夹:在任意位置创建一个文件夹作为项目的根目录。 2. 在项目根目录下创建源文件:可以使用VSCode的文件资源管理器在项目根目录下创建多个源文件(以`.c`为扩展名)和头文件(以`.h`为扩展名)。 3. 创建Makefile:在项目根目录下创建一个名为`Makefile`(注意首字母大写)的文件,并在其中编写构建规则。 4. 编写构建规则:在Makefile中,你可以定义编译器、编译选项、链接选项以及构建目标等。以下是一个简单的示例: ```makefile CC = gcc CFLAGS = -Wall -Wextra LDFLAGS = SRCDIR = src OBJDIR = obj SOURCES = $(wildcard $(SRCDIR)/*.c) OBJECTS = $(patsubst $(SRCDIR)/%.c, $(OBJDIR)/%.o, $(SOURCES)) TARGET = myproject $(TARGET): $(OBJECTS) $(CC) $(LDFLAGS) $^ -o $@ $(OBJDIR)/%.o: $(SRCDIR)/%.c $(CC) $(CFLAGS) -c $< -o $@ .PHONY: clean clean: rm -rf $(OBJDIR)/*.o $(TARGET) ``` 在这个示例中,我们假设源文件存放在名为`src`的文件夹中,目标文件存放在名为`obj`的文件夹中。`CC`变量指定了编译器,`CFLAGS`变量指定了编译选项,`LDFLAGS`变量指定了链接选项。`$(SOURCES)`变量使用通配符获取所有的源文件,`$(OBJECTS)`变量使用模式替换获取所有的目标文件。`$(TARGET)`是最终的可执行文件名。 构建规则中的第一个目标`$(TARGET)`表示最终的可执行文件,它依赖于所有的目标文件。第二个目标`$(OBJDIR)/%.o`表示每个源文件对应的目标文件,它依赖于对应的源文件。规则中使用了变量展开和自动变量,这样可以根据实际情况进行构建。 最后,使用`make`命令在项目根目录下执行Makefile,并构建项目。如果一切顺利,将会在项目根目录下生成可执行文件。 希望这个简单的示例可以帮助你开始编写文件的C语言项目,并使用Makefile进行构建。如果你有其他问题,请随时提问!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值