精华内容
下载资源
问答
  • make文件夹包含了两个子文件夹,a_b子文件夹实现目标Makefile编译,projects子文件夹实现层次Makefile文件编译。make文件夹中实现Makefile文件编译,即调用a_b和project2子文件夹中Makefile编译。
  • Makefile 多目录编译Demo

    2013-11-15 23:29:07
    多目录编译Makefile 三种用法 一定要会的
  • makefile实现多目录文件编译

    千次阅读 2017-03-08 20:02:32
    现要在Ubuntu上编译一个大型工程文件,假设各文件目录及关系如下: /home/vote: comlib(文件夹) vote.c(主函数在此.c文件中实现) makefile /home/vote/comlib: include(文件夹) lib(文件夹) libsrc...

    现要在Ubuntu上编译一个大型工程文件,假设各文件目录及关系如下:

    /home/vote:

    comlib(文件夹)

    vote.c(主函数在此.c文件中实现)

    makefile

    /home/vote/comlib:

    include(文件夹)

    lib(文件夹)

    libsrc(文件夹)

    /home/vote/comlib/include:

    comlib.h(头文件)

    /home/vote/comlib/lib:

    暂无()

    /home/vote/comlib/libsrc:

    file.c、tcp.c、debug.c(这三个.c文件实现main函数调用的函数,函数定义在comlib.h中完成)

    makefile

     

    (一)现要编译此工程则需要实现两个makefile,一个是/home/vote/comlib/libsrc下的makefile,用来编译子目录下各文件,其写法如下所示:

    .SUFFIXES:.c
    HOMEDIR=/home/vote
    COMDIR=$(HOMEDIR)/comlib
    INCDIR=-I$(COMDIR)/include


    CC=gcc
    CFLAG=-O 
    EDF=
    help:
            @echo Please input filename that will be made
            @echo 'syntax: make <help|all|"filename">'
    all:file tcp debug
    .c:
            if [ -f $(COMDIR)/lib/libcom.a ]; then ar -x $(COMDIR)/lib/libcom.a; fi  
            $(CC) -c $< $(CFLAG) $(INCDIR)
            ar -rv libcom.a *.o 
            rm *.o
            mv libcom.a $(COMDIR)/lib

     

    各变量及命令的含义:

    .SUFFIXES 指定合法的源文件扩展名,此处是.c文件,即makefile只编译.c文件。

    HOMEDIR为宏,指定当前项目的主目录,其余两个性质相同。

    CFLAG指定编译选项。

    if [ -f $(COMDIR)/lib/libcom.a ]; then ar -x $(COMDIR)/lib/libcom.a; fi         此句是if函数的一种用法,此处含义应该是如果此目录下有libcom.a库文件则将此文件解压缩成.o文件释放到此目录下(经过笔者亲自测试,若此目录下没有libcom.a文件,此命令就会创建一个libcom.a库,但ar -x命令貌似没有创建库的功能,这点最终没能想通,有同学知道其原理的话欢迎指点)。

    $<变量为第一个依赖文件的名称。

    ar -rv libcom.a *.o将.o文件加入到libcom.a中。

     

    编译方法:在makefile目录下输入make all即可自动完成所有子文件编译。

       

    (二)第二个需要编译的文件是/home/vote目录下的vote.c文件,其makefile如下所示:

    .SUFFIXE:.c
    HOMEDIR=/xilinx/SamShare/APUE/vote
    COMDIR=$(HOMEDIR)/comlib
    INCDIRS=-I$(COMDIR)/include
    LIBDIRS=-L$(COMDIR)/lib
     
    LIB= -lcom 
    CC=gcc
    CFLAGS=-O 
     EDF=
      
    .c:
            $(CC) -o $@ $< $(CFLAGS) $(INCDIRS) $(LIBDIRS) $(LIB)
       #$@意为完整的目标名称。
    ~                                                                

    其各变量及命令与第一个相同,这里不多介绍,需要注意的是此处要链接.../include目录下的comlib.h头文件,以及.../lib下由第一个makefile生成的libcom.a库文件。

     

    编译方法:在makefile目录下输入make vote即可。

    展开全文
  • makefile编译目录文件 自动生成编译目录欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格...

    makefile编译多目录文件 自动生成编译目录


    这段时间学习了makefile和gcc的一些用法,感受到了makefile的强大,在实践过程中,深刻体会到,要想写出一个号的make框架,不仅仅是要了解makefile规则,还要熟悉gcc和shell,这些东西在makefile中各种穿插,对初学者来说,往往一头雾水,看着看着别人的例子就不知道怎么理解下去,但是还是要耐心的去抽丝剥茧,最终才能恍然大悟。
    下面的这个makefile,虽然网络上这种例子很多,但这是根据自己理解写成的,也算是对这段时间学习的一个总结。主要完成了下面几点功能:

    1. 自动化搜索源文件目录;
    2. 目标文件和编译中间件文件存储到指定文件统一管理;
    3. 使用自动化变量自动编译;
    4. 使用shell创建build目录;
    5. 使用makefile函数进行文本处理。

    目录结构如下:
    在这里插入图片描述
    makefile

    #获取当前工作路径
    TOP_DIR:=$(CURDIR)
    #设置目标名
    Target:=hello
    #设置源文件目录
    SRC_PATH:=$(TOP_DIR) $(TOP_DIR)/other
    #设置编译目录
    BUILD_PATH:=$(TOP_DIR)/build
    #设置编译临时目录
    OBJ_PATH:=$(BUILD_PATH)/temp
    #设置编译最终文件目录
    BIN_PATH:=$(BUILD_PATH)/bin
    #获取源文件目录下所有c文件列表
    SRC:=$(foreach dir,$(SRC_PATH),$(wildcard $(dir)/*.c))
    #去掉c文件目录
    SRC_WITHOUT_DIR:=$(notdir $(SRC))
    #生成.o文件列表
    OBJ_WITHOUT_DIR:=$(patsubst %.c,%.o,$(SRC_WITHOUT_DIR))
    #为.o文件列表加上编译目录
    OBJ_WITH_BUILD_DIR:=$(addprefix $(OBJ_PATH)/,$(OBJ_WITHOUT_DIR))
    $(info "OBJ_WITH_BUILD_DIR:$(OBJ_WITH_BUILD_DIR)")
    #添加头文件目录
    CFLAGS=$(addprefix -I,$(SRC_PATH))
    #为gcc添加源文件搜索目录
    VPATH=$(SRC_PATH)
    #编译目标
    all:build_prepare $(Target)
    #连接目标
    $(Target):$(OBJ_WITH_BUILD_DIR) 
    	cc -o $(BIN_PATH)/$@ $^
    #编译生成.o文件
    $(OBJ_PATH)/%.o:%.c
    	cc -c $(CFLAGS) -o $@ $<
    #创建编译目录
    build_prepare:
    	@if [ ! -d $(BUILD_PATH) ]; then \
    	mkdir -p $(OBJ_PATH); \
    	mkdir -p $(BIN_PATH); \
    	fi
    
    .PHONY:clean
    
    clean:
    	-rm -rf $(BIN_PATH)/$(Target) $(OBJ_WITH_BUILD_DIR)
    
    
    
    展开全文
  • 多文件目录makefile文件递归执行编译所有c文件 首先说说本次嵌套执行makefile文件的目的:只需make根目录下的makefile文件,即可编译所有c文件,包括子目录下的。 意义:自动化编译行为,以后编译自己的c文件...
     
    

    首先说说本次嵌套执行makefile文件的目的:只需make根目录下的makefile文件,即可编译所有c文件,包括子目录下的。

    意义:自动化编译行为,以后编译自己的c文件时可把这些makefile文件直接复制到相应目录即可方便编译出所有文件。这些makefile文件是通用的,只需根据自己的工程情况改动少许内容即可。下面会说。

    总体思路是:把目标文件放在debug文件夹下的obj目录下,把最终的二进制文件放在debug文件夹下的bin目录下;如何递归编译所有除了debug目录下的makefile文件呢:获得当前目录下的所有子目录,执行子目录下的makefile文件;获取当前目录下的所有c文件,编译c文件并放到指定的目标文件夹下。最后再执行debug目录下的makefile文件生成bin文件。

    注意:除了debug文件夹比较特殊外,其他的子目录下都需要有Makefile文件,而且这些Makefile是相同的,除了根目录下的makefile文件有些不同外。即除了bin和obj目录以外的其他目录都需要Makefile文件,即使目录下没有c文件或者其他目录。

    过程:首先在根目录下新建一个debug文件夹,debug文件夹下有bin目录和obj目录和一个Makefile文件,结构如下图。(这个debug文件里的makefile文件需要最后执行)(tree工具需要自己安装的,ubuntu下直接输入sudo apt-get install tree即可,但有时可能需要先sudo apt-get update才行)

    整个目录结果如下图:

    然后在根目录下新建Makefile文件,根目录下也可能会有c文件,故也需处理根目录下的c文件,内容如下:

    复制代码
    #设置编译器
    CC=gcc
    #debug文件夹里的makefile文件需要最后执行,所以这里需要执行的子目录要排除debug文件夹,这里使用awk排除了debug文件夹,读取剩下的文件夹
    SUBDIRS=$(shell ls -l | grep ^d | awk '{if($$9 != "debug") print $$9}')
    #无需下一行的注释代码,因为我们已经知道debug里的makefile是最后执行的,所以最后直接去debug目录下执行指定的makefile文件就行,具体下面有注释
    #DEBUG=$(shell ls -l | grep ^d | awk '{if($$9 == "debug") print $$9}')
    #记住当前工程的根目录路径
    ROOT_DIR=$(shell pwd)
    #最终bin文件的名字,可以更改为自己需要的
    BIN=myapp
    #目标文件所在的目录
    OBJS_DIR=debug/obj
    #bin文件所在的目录
    BIN_DIR=debug/bin
    #获取当前目录下的c文件集,放在变量CUR_SOURCE中
    CUR_SOURCE=${wildcard *.c}
    #将对应的c文件名转为o文件后放在下面的CUR_OBJS变量中
    CUR_OBJS=${patsubst %.c, %.o, $(CUR_SOURCE)}
    #将以下变量导出到子shell中,本次相当于导出到子目录下的makefile中
    export CC BIN OBJS_DIR BIN_DIR ROOT_DIR
    #注意这里的顺序,需要先执行SUBDIRS最后才能是DEBUG
    all:$(SUBDIRS) $(CUR_OBJS) DEBUG
    #递归执行子目录下的makefile文件,这是递归执行的关键
    $(SUBDIRS):ECHO
        make -C $@
    DEBUG:ECHO
        #直接去debug目录下执行makefile文件
        make -C debug
    ECHO:
        @echo $(SUBDIRS)
    #将c文件编译为o文件,并放在指定放置目标文件的目录中即OBJS_DIR
    $(CUR_OBJS):%.o:%.c
        $(CC) -c $^ -o $(ROOT_DIR)/$(OBJS_DIR)/$@
    CLEAN:
        @rm $(OBJS_DIR)/*.o
        @rm -rf $(BIN_DIR)/*
    复制代码

    上面的注释很详细了,具体的命令如果不清楚,自己可以google一下,譬如:wildcard patsubst awk等

    读者可以根据自己的需要更改自己的debug目录和目标文件目录和bin文件目录

    其他子目录下的Makefile文件的内容如下:

    复制代码
     1 #子目录的Makefile直接读取其子目录就行
     2 SUBDIRS=$(shell ls -l | grep ^d | awk '{print $$9}')
     3 #以下同根目录下的makefile的相同代码的解释
     4 CUR_SOURCE=${wildcard *.c}
     5 CUR_OBJS=${patsubst %.c, %.o, $(CUR_SOURCE)}
     6 all:$(SUBDIRS) $(CUR_OBJS)
     7 $(SUBDIRS):ECHO
     8     make -C $@
     9 $(CUR_OBJS):%.o:%.c
    10     $(CC) -c $^ -o $(ROOT_DIR)/$(OBJS_DIR)/$@
    11 ECHO:
    12     @echo $(SUBDIRS)
    复制代码

    debug目录下的Makefile文件如下:

    1 OBJS=*.o
    2 ODIR=obj
    3 $(ROOT_DIR)/$(BIN_DIR)/$(BIN):$(ODIR)/$(OBJS)
    4     $(CC) -o $@ $^

    最后只需在根目录下,我的是我的根目录makefile目录下,执行make命令即可:

    结果目录结果为:

    然后执行". debug/bin/myapp"即可;最后可以执行make CLEAN清楚掉所有的目标文件和bin文件。

    参考资料为:http://blog.csdn.net/zplove003/article/details/7066595

    展开全文
  • Makefile编译目录文件

    千次阅读 2018-08-24 14:56:16
    今天终于学会了编写makefile,使之可以编译目录下所有c\cpp文件。 编译个c文件一般有两个功能,一个是每个c文件都有main函数,就是说每个c文件的可执行文件是独立的,各自是各自的;第二个是个c文件用来编译成...

    个人分类: Makefile

    今天终于学会了编写makefile,使之可以编译目录下所有c\cpp文件。

    编译多个c文件一般有两个功能,一个是每个c文件都有main函数,就是说每个c文件的可执行文件是独立的,各自是各自的;第二个是多个c文件用来编译成一个可执行文件。

     

    首先说第一个,内容如下,这个makefile是为了编译opencv代码的。

    [cpp] view plain copy

    1. CFLAGS= -g -O3 `pkg-config opencv --cflags`  
    2. LIBS = `pkg-config opencv --libs`  
    3. C_SRC = $(wildcard *.c)  
    4. C_OBJ = $(patsubst %c, %o, $(C_SRC))  
    5. CPP_SRC = $(wildcard *.cpp)  
    6. CPP_OBJ = $(patsubst %cpp, %o, $(CPP_SRC))  
    7.   
    8. .PHONY:all clean  
    9.   
    10. all:$(CPP_OBJ) $(C_OBJ)  
    11.   
    12. .c.o:  
    13.     gcc $(CFLAGS) -o $@ $< $(LIBS)   
    14. .cpp.o:  
    15.     g++ $(CFLAGS) -o $@ $< $(LIBS)  
    16.   
    17.   
    18. clean:  
    19.     rm *~ *.o -f  
     
    1. CFLAGS= -g -O3 `pkg-config opencv --cflags`

    2. LIBS = `pkg-config opencv --libs`

    3. C_SRC = $(wildcard *.c)

    4. C_OBJ = $(patsubst %c, %o, $(C_SRC))

    5. CPP_SRC = $(wildcard *.cpp)

    6. CPP_OBJ = $(patsubst %cpp, %o, $(CPP_SRC))

    7.  
    8. .PHONY:all clean

    9.  
    10. all:$(CPP_OBJ) $(C_OBJ)

    11.  
    12. .c.o:

    13. gcc $(CFLAGS) -o $@ $< $(LIBS)

    14. .cpp.o:

    15. g++ $(CFLAGS) -o $@ $< $(LIBS)

    16.  
    17.  
    18. clean:

    19. rm *~ *.o -f

     

    cflags 和 libs就不说了,

    c_src和c_obj中,$(wildcard *.c, *.cpp, /***/***/*.c)是为了找出目录和指定目录下所有的后缀为c和cpp的文件,这个功能也可以使用c_src=$(shell echo *.c)实现。

    $(patsubst %cpp, %o, $(CPP_SRC))中是为了将所有的cpp文件的后缀替换为o文件,这个功能也可以通过CPP_OBJ=$(CPP_SRC:%.c=%.o)实现

    PHONY是伪目标

    all后是要生成的所有目标文件

    最后的.c.o和.cpp.o这两个,是为了通配编译c后缀和cpp后缀文件的规则。

    这样即可编译目录下所有的源文件,为各自生成可执行文件了。

    Makefile编译目录下多个文件

     

    参考网址:http://forkhope.diandian.com/post/2012-10-12/40040828841

                        http://blog.csdn.net/jernymy/article/details/6401065
                        http://hi.baidu.com/zengzhaonong/item/f07c81e1da455210585dd89a


    第二个是编译所有c文件,生成一个目标文件。有了上一个的基础,第二个目标的例子为

    [cpp] view plain copy

    1. 01 CC = gcc  
    2. 02 LD = gcc  
    3. 03 CFLAGS = -Wall -c -Dgliethttp -I../include -L lib_path  
    4. 04 LDFLAGS = -lpthread  
    5. 05   
    6. 06 SRCS = $(wildcard *.c source/*.c)  
    7. 07 OBJS = $(patsubst %c, %o, $(SRCS))  
    8. 08 TARGET = gliethttp  
    9. 09   
    10. 10 .PHONY: all clean  
    11. 11   
    12. 12 all: $(TARGET)  
    13. 13   
    14. 14 $(TARGET): $(OBJS)  
    15. 15     $(LD) $(LDFLAGS) -o $@ $^  
    16. 16   
    17. 17 %o: %c  
    18. 18     $(CC) $(CFLAGS) -o $@ $<  
    19. 19   
    20. 20 clean:  
    21. 21     rm -f *.o $(TARGET)  
    展开全文
  • mtk_hif_sdio-objs := linux/hif_sdio.o  mtk_hif_sdio-objs += linux/hif_sdio_chrdev.o  mtk_hif_sdio-objs += linux/osal.o
  • makefile文件使用了变量和模式规则,是一份兼容性很强的代码指令,若要编译其它源文件,只需在SRCS变量后面修改即可。 使用: 1、在源码路径下的终端中输入 make 即可运行makefile。 2、输入make clean可以清除所有...
  • Linux makefile 文件的使用例子,用Makefile编译多文件。 一个简单的Makefile的编写,适合初学者.
  • makefile多目录文件

    2012-08-17 09:31:02
    由于项目需要,网上这方面正确的例子也不,所以花了一天的时间编写了这个makefile,并正确编译出了这上百个文件,与大家共享,希望到时候大家少走弯路,学业无止境
  • 里面包含了实例项目,用于学习层次文件夹下面Makefile文件的自动编译,使用环境是Ubuntu等linux环境,同时要求的环境是具有gcc编译,同时具有make即可。里面项目代码文件较简单,只简单输出。
  • linux 工程编译 makefile 工程目录下所有的C文件,工程目录下可以有子目录
  •    为了方便管理程序文件,我们一般会添加文件夹来进行分类管理,这时候为了方便我们编译,就需要在各个文件夹里面添加一个makefile文件,make后就会自动的帮我们编译生成可执行文件。 一.简单篇 1. 先给出目录...
  • Makefile文件: CC = gcc INC = -I./Print -I./Base OBJ = obj target: $(OBJ) $(OBJ)/main.o $(OBJ)/print1.o $(OBJ)/print2.o $(OBJ)/print3.o $(OBJ)/base.o cd $(OBJ) && $(CC) main.o print1.o print2.o...
  •  1、由预处理器把程序员所编写的C代码翻译成标准C代码,可以得到以.i结尾的预处理文件。  gcc -E code.c  gcc -E code.c -o code.i   2、由汇编器把标准的C代码生成汇编代码,可以得到以.s结尾的汇编文件。  ...
  • makefile多目录,多目标编译

    千次阅读 2014-10-01 20:15:46
    makefile 经常会遇到需要一个编译不同的子模块,由子模块再编译
  • 这个makefile,在linux环境下可以编译当前目录下所有.c文件,可以把它们编译为可执行文件,或库文件。又通用,又简单.
  • makefile多目录多文件

    千次阅读 2017-03-12 11:14:44
    makefile多目录多文件
  • Makefile嵌套编译多文件项目

    千次阅读 2018-04-07 16:48:32
    多文件的项目中,一个工程中的源文件比较多,其按类型、功能、模块分别放在若干个目录中,为了项目更加规整,我们常常要将源文件头文件执行文件等分开,所以在编译Makefile时就要做好整个项目的编译准备工作,...
  • makefile编译多文件

    2014-05-24 21:47:22
    makefile同时编译多文件,以tcp通信协议为例,教你一步一步学习makefile
  • Makefile编译多个cpp文件

    千次阅读 2018-09-02 20:41:05
    Makefile编译多个cpp文件 1:首先:用g++编译.cpp文件的方法: 可以直接用: g++ 文件名.cpp 生成一个名为 “文件名.out” 的可执行文件 其原理为: 先由: g++ -c 文件名.cpp:生成一个名为 “文件名.o” 的...
  • Makefile文件arm-none-linux-gnueabi-gcc编译文件,linux下个.C文件统一使用make文件进行编译
  • caffe编译Makefile.config文件,将错误全部更改后的Makefile.config文件,直接放在caffe根目录下。
  • Makefile编译多文件

    千次阅读 2018-08-16 17:09:06
    all:easy_select tcp_select .PHONY:all easy_select:easy_select.c gcc $^ -o $@ tcp_select:tcp_select.c gcc $^ -o $@ ... # tab命令 #指定如何从依赖文件生成目标文件  # make指令的时候...
  • 文件夹下的Makefile自动编译

    千次阅读 2015-07-07 10:25:11
    时候我们可能会遇到这样的情况:要编译多目录下的代码,然后要将中间文件和执行文件分别放到不同的文件夹下面。好吧,贴图的排版第一次用,将就看一下。下面的图是我练习用的一个项目文件结构图。其中bin用来...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 841,482
精华内容 336,592
关键字:

makefile多目录文件编译