精华内容
下载资源
问答
  • 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即可。

    展开全文
  • 一、需要用到的几测试文件

    一、需要用到的hw.cpp hw.h funtest.cpp funtest.h makefile 几个测试文件

    1、hw.cpp代码如下:

    #include "hw.h"
    #include "funtest.h"
    using namespace std;
    using namespace boost;
    int main()
    {
      timer t; 
       {
         int i=1;
       }
       auto i="abc";
       cout<<i<<endl;
       cout<<"endl"<<endl;
       cout<<"abcdefj"<<endl;
       cout << "最大处理时间:" << t.elapsed_max() / 3600 << " h" << endl;  
       cout << "最小处理时间:" << t.elapsed_min() << " s" << endl;  
       cout << "逝去时间:" << t.elapsed() << " s" << endl;  
       cout<<"每行需要一个tab键"<<endl;
       funtest::testa test1;
       test1.testafun();
    }

    2、hw.h代码如下:

    #ifndef __HW_H__
    #define __HW_H__
    #include <iostream>
    #include <boost/timer.hpp>
    #include <boost/progress.hpp>
    
    #endif


    3、funtest.cpp代码如下:

    #include "funtest.h"
    
    using namespace std;
    
    namespace funtest
    {
    testa::testa()
    {
      cout<<"testa()"<<endl;
    }
    
    testa::~testa()
    {
      cout<<"~testa()"<<endl;
    }
    
    void testa::testafun()
    {
       cout<<"testa::testafun()"<<endl;
    }
    }


    4、funtest.h代码如下:

    #ifndef __FUNTEST__H__
    #define __FUNTEST__H__
    #include <iostream>
    namespace funtest
    {
        class testa
            {
              public:
              testa();
              ~testa();
              void testafun();  
            };
    }
    
    #endif


    二、makefile的编写以及使用示例

    1、makefile代码如下:

    #----------------------------------------------------------
    #makefile helloworld测试用例
    #
    #
    #
    #
    #-----------------------------------------------------------
    ggg=g++49
    exe=helloworld
    
    #所有的.o文件写在这里
    obj = hw.o funtest.o
    
    #所要关联的cpp文件写在这里
    cpp = hw.cpp funtest.cpp
    
    $(exe):$(obj)
            @echo "链接开始................"
            $(ggg) -o $(exe) $(obj)
    
    
    hw.o : $(cpp)
            @echo "编译开始................"
            $(ggg) -std=c++11 -c $(cpp)
    
    
    
    .PHONY : clean delete
    all:
            @echo "开始make all..........."
    
    clean:
            @echo "开始清理................"
            -rm -rf $(obj) $(exe)
    delete:
            @echo "delete.................."
            pwd


    2、使用方法linux简单示例。

    [mythcpp@localhost src]$ make clean
    开始清理................
    rm -rf hw.o funtest.o helloworld
    [mythcpp@localhost src]$ make
    编译开始................
    g++49 -std=c++11 -c hw.cpp funtest.cpp
    链接开始................
    g++49 -o helloworld hw.o funtest.o
    [mythcpp@localhost src]$ make all
    开始make all...........
    [mythcpp@localhost src]$ make delete
    delete..................
    pwd
    /home/mythcpp/src

    3、程序输出示例:
    [mythcpp@localhost src]$ ./helloworld
    abc
    endl
    abcdefj
    最大处理时间:2.56205e+09 h
    最小处理时间:1e-06 s
    逝去时间:0 s
    每行需要一个tab键
    testa()
    testa::testafun()
    ~testa()
    [mythcpp@localhost src]$


    三、需要注意的几点
    1、g++49是g++4.9版本的g++
    命令行示例:
    [mythcpp@localhost src]$ ll /usr/bin/g++49
    lrwxrwxrwx. 1 root root 23 May  8 05:05 /usr/bin/g++49 -> /home/gcc-4.9.0/bin/g++
    [mythcpp@localhost src]$ type g++49
    g++49 is /usr/bin/g++49

    2、makefile以tab为间格,不要以空格开始,会报错的。

    3、echo 要写在lable下面,如:
    $(exe):$(obj)
            @echo "链接开始................"
            $(ggg) -o $(exe) $(obj)
    4、makefile文件中的all clean delete 等等伪标签可以自行实现功能命令。
    这里最主要是使用make 和make clean两条命令

    5、关于makefile的详细编写请百度,谷歌,此文档只适用入门。
    
    展开全文
  • 主要实现:利用两个c文件结合编译输出“hello zhangsan!”字符串,进而练习makefile文件编写的方法 gcc的编译过程 Makefile语法规则 简单地讲,Makefile的作用就是让编译器知道要编译一个文件需要依赖哪些文件,...

    研究给定的C语言程序组,编写相应的makefile,并执行查看结果。

    主要实现:利用两个c文件结合编译输出“hello zhangsan!”字符串,进而练习makefile文件编写的方法

    gcc的编译过程
    在这里插入图片描述

    Makefile语法规则
    简单地讲,Makefile的作用就是让编译器知道要编译一个文件需要依赖哪些文件,同时当那些依赖文件有了改变,编译器会自动发现最终的生成文件已经过时,而重新编译相应的模块。Makefile的内容规定了整个工程的编译规则。一个工程中的许多源文件按其类型、功能、模块可能分别被放在不同的目录中,Makefile定义了一系列的规则来指定,比如哪些文件是有依赖性,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译。

    Makefile有其自身特定的编写格式并且遵循一定的语法规则。

    #注释
    目标文件:依赖文件列表
    …………………………
    
    <tab>命令列表
    …………………………
    

    一、编写主函数main.c

    1、输入编辑文件指令

    #vi main.c
    

    2、编写main.c文件内容为下:

    include<stdio.h>
    #include"name.h"
    
    void main()
    {
        printf("hello ");
        name1();
    
    }
    

    二、编写name.c文件和name.h文件

    1、输入编写name.c文件指令

    #vi name.c
    

    2、name.c文件内容为下

    include<stdio.h>
    #include"name.h"
    void name1()
    {
        printf("zhangsan!\n");
    }
    

    3、输入编写name.h文件指令

    #vi name.h
    

    4、编写name.h内容为下

    #ifndef _name_h_
    #define _name_h_
    
    void name1();
    
    #endif
    

    三、编写makefile文件

    1、编辑makefile文件指令

    #vi makefile
    

    2、编写makefile内容

    main:main.o name.o
        gcc main.o name.o -o main
    main.o:main.c name.h
        gcc -c main.c -o main.o
    name.o:name.c name.h
        gcc -c name.c -o name.o
    

    ~

    四、编译运行

    1、编译

    #make
    

    2、运行

    #./main	
    

    运行结果如下:
    在这里插入图片描述

    五、对makefile文件进行修改

    Makefile文件中除了一系列的规则,对于变量的使用也是一个很重要的内容。

    Linux下的Makefile文件中可能会使用很多的变量,定义一个变量(也常称为宏定义),只要在一行的开始定义这个变量(一般使用大写,而且放在Makefile文件的顶部来定义),后面跟一个=号,=号后面即为设定的变量值。如果要引用该变量,用一个$符号来引用变量,变量名需要放在$后的()里。
    make工具还有一些特殊的内部变量,它们根据每一个规则内容定义。
    $@:指代当前规则下的目标文件列表。
    $<:指代依赖文件列表中的第一个依赖文件。
    $^:指代依赖文件列表中所有依赖文件。
    $?:指代依赖文件列表中新于对应目标文件的文件列表。

    1、上面两句相当于c语言中的宏定义了(如果需要用到的时候使用“$(宏定义)“即可,例如 “ $(obj)”)
    obj=main.o name.o
    cc=gcc

    2、 (1)可以修改为(2)
    (1)main:main.o name.o
    (2)main:$(obj)

    3、同上
    (1)gcc main.o name.o -o main
    (2)$(cc) $(obj) -o main

    4、($(<)表示依赖文件的第一个文件)
    (1)main.o:main.c name.h
    gcc -c main.c -o main.o
    (2)main.o:main.c name.h
    $(cc) -c $(<) -o main.o
    5、($@:指代当前规则下的目标文件列表。)
    (1)name.o:name.c name.h
    gcc -c name.c -o name.o
    (2) name.o:name.c name.h
    $(cc) -c $(<) -o $(@)

    整个makefiile修改后代码如下

    obj=main.o name.o
    cc=gcc
    main:$(obj)
        $(cc) $(obj) -o main
    main.o:main.c name.h
        $(cc) -c $(<) -o main.o
    name.o:name.c name.h
        $(cc) -c name.c -o $(@)
    
    展开全文
  • 在Ubuntu上编写makefile文件,使用make命令进行编译,但是出现了makefile:2: *** missing separator. Stop.”这样的情况; 出现这种问题,根据错误提示,应该是makefile文件出现了问题,搜了一圈发现问题无非种:...

    在Ubuntu上编写makefile文件,使用make命令进行编译,但是出现了makefile:2: *** missing separator. Stop.”这样的情况;

    出现这种问题,根据错误提示,应该是makefile文件出现了问题,搜了一圈发现问题无非两种:

    • makefile文件中命令行的行首不能有空格,而要用tab键;
    • makefile文件中的字符有格式要求,必须是英文,不能有中文字符。 

    基于上述问题进行排查,修改完发现还是提示相同的missing separator. Stop错误。问题真正的根源在于我们敲入的tab键不是真正的tab键,而是被四个空格代替了。接下来需要修改vim的配置。

    在终端输入

    vim ~/.vimrc

    可以看到我们的tab键确实被四个空格代替.

    在 ~/.vimrc文件中set expandtab 下面添加下面的语句

    autocmd FileType make set noexpandtab

    添加之后 Esc,:wq保存退出;打开makefile文件,将之前的假<tab>删除,再次插入tab。保存退出。

    此次执行makefile文件就不会报missing separator. Stop错误了。

    展开全文
  • 编写Makefile文件

    千次阅读 2006-05-11 16:14:00
    1、编写MakefileUNIX系统上很多软件包都是使用make程序和Makefile文件实现自动编译的,make程序的目的就是自动确定一软件包的哪些部分需要重新编译,并用特定的明令去编译他们,准确的使用make可以大大减少编译程序...
  • Makefile编译目录下多个文件

    千次阅读 2018-08-24 14:56:16
    编译多个c文件一般有两个功能,一个是每个c文件都有main函数,就是说每个c文件的可执行文件是独立的,各自是各自的;第二个是多个c文件用来编译成一个可执行文件。   首先说第一个,内容如下,这个makefile是为了...
  • 在网上找到的一非常好的makefile文件,可以编译本文件夹下的所有.c文件,之需要定义输出文件名,不需要指定main文件的文件名,非常的好,非常的方便,注释也很详细,收藏并分享给需要的人。 #####################...
  • 这时就需要为两个平台分别编写Makefile,但颇为不便。查阅资料后得知可以使用make configure调整编译选项,又显牛刀杀鸡。 一种较为简便的方式是在使用make指令时,添加额外参数以改变脚本中某变量的值,配合...
  • c文件如何编译为ko的MAKEFILE文件编写

    千次阅读 2015-11-09 16:36:12
    c文件如何编译为ko的MAKEFILE文件编写 2014-04-29 11:24:25 分类: Android平台 首先需要知道: obj-m = *.o obj-y = *.o 上面两者的区别在于,前者才会生成ko文件,后者只是代码编译进内核,...
  • 在写作业时想用一个Makefile同时编译.c文件并生成可执行文件,在查找了相关资料后,发现可以添加一伪可执行文件makefile 默认只生成第一可执行文件,所以可以用伪可执行文件,make 过程中并不生成 这伪...
  • 编写 Makefile文件 (一)

    千次阅读 2020-06-29 17:02:33
    参考:《linux程序设计(第四版)》 本文的编写从简单到复杂,一步一步完成...如果我们想要编译个文件,首先想到的是在shell 下执行gcc命令,那么我们先通过几shell脚本来实现文件编译。 #! /bin/bash set .
  • 利用makefile文件编译c++源文件

    万次阅读 2017-07-08 00:22:12
    在Linux下,利用makefile文件编译链接c/c++源文件,并生成可执行文件 本文介绍了makefile文件的写法和相应参数的含义以及如何生成、使用so库文件
  • 首先需要知道: ...生成KO文件,分种情况:单个.c文件和多.c文件【以展讯7730 ANDROID4.4为例】 1.单个.c文件 kernel配置文件中定义 CONFIG_RUNYEE_CAMVIB=m 注意上面的m,表示作为一模块进行编译
  • 0. 相关阅读  玩转Makefile | 系列综述  玩转Makefile | 基础入门  玩转Makefile | 四步教... 玩转Makefile | 编译有共用文件的多程序  玩转Makefile | 一次编译目标   1. 使用场景 在企业项目中...
  • Makefile代码备份 CC = gcc src = $(wildcard ./*.c) #all *.c obj = $(patsubst ./%.c, ./%.o, $(src)) #all *.o target = main.cgi $(target):$(obj) $(CC) $(obj) -o $(target) \cp $@ /nfsroot/u...
  • 我在./src/目录下有若干.c文件,想个文件均进行编译,中间代码文件*.o存放在./build/obj/下,目标可执行文件放在./build/下 Makefile的工作流程 没有指定输出项目时,Makefile会先在...
  • 为第1题中的程序编写makefile文件,用make编译后改成返回最小值,再编译,观察有多少文件不需要重新编译。 1.avg.h float avg(int x1,int x2,int x3,int x4,int x5); avg.c float avg(int x1,int x2,int x3,
  • 简单编写makefile

    2018-12-17 21:04:11
    1. 为什么需要编写makefile 1.一工程中的源文件不计其数,按类型、功能、模块分别放在若干目录中,若尝试一个个文件编译,未免效率太低,而编写一良好的makefile则会提高我们编译的效率 2.在makefile中,我们...
  • vsCode中使用makefile实现debug/release版本的编译简单代码make命令向makefile文件传输参数在VSCode中创建不同的task延伸:提供一稍微通用一点的makefile 简单代码 为了测试,创建文件hello.cpp,编写以下简单代码...
  • keil 采用 makefile 实现编译

    千次阅读 2018-01-25 15:19:07
    由于keil 软件需要收费,故有许多公司或者个人希望能够使用makefile 实现编译功能。如此一来,就可以脱离了keil 公司的限制,自由开发。 2 开发环境 (1) windows 操作系统的PC一台。 (2)arm-gcc windows端...
  • makefile文件使用了变量和模式规则,是一份兼容性很强的代码指令,若要编译其它源文件,只需在SRCS变量后面修改即可。 使用: 1、在源码路径下的终端中输入 make 即可运行makefile。 2、输入make clean可以清除所有...
  • Makefile文件的简单编写

    千次阅读 2019-07-18 17:46:15
    在嵌入式开发中,一个工程中的源文件是非常多的,如果一个个编译会很麻烦,Makefile的出现解决了这个麻烦事,只要我们把Makefile写好,只需要“make”一下,整个工程完全自动编译,极大的提高了软件开发的效率。...
  • 个Makefile编译个文件idt.c fm.c lpc.c其中模块初始化代码在lpc.c中,要把三个文件编译成一lpc.ko文件,结果用这个makefile生成的lpc.ko出现如下错误:module license 'unspecified' taints kernel ...
  • Makefile嵌套编译文件项目

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

    千次阅读 2014-12-22 16:01:53
    一、概述 现在,免费的操作系统Linux的使用者越来越多。Linux的爱好者们也许要在Linux软件开发上一展...在命令行方式下,如果源程序只有一两个文件,那么还可以使用特定的语言编译器进行编译和链接,但是,一旦源程序
  • 多层目录编译makefile文件编写

    千次阅读 2013-02-01 00:47:10
    一直想自己做一目录结构稍复杂一点的makefile,看make的manual上写的有点不好理解,再从网上搜搜也没有发现比较好的教程。 我是搞工程的,懂点计算,也没有受过专业编程训练,对于一些技术不是很懂,有时想使用...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 38,865
精华内容 15,546
关键字:

编写makefile实现对两个文件的编译