zoukankan      html  css  js  c++  java
  • 转:教会你如何编写makefile文件

    最近一直在学习makefile是如何编写的。当我们写的程序文件比较少的时候,敲入gcc /g++,当你在大型工程中,在一个个编译文件的话,你可能就会很郁闷。linux有一个自带的make命令,它让你的工作省去了很大的力气,但是你要学习如何编写makefile文件。

    makefile是一种特殊的文件格式,他将会帮你自动管理你的项目,很强大。
     
    下面通过实例一步步讲解如何使用makefile。下面的四段代码。
     
    //main.cpp
     
    #include "functions.h" 
     
    int main()
     
    { 
     
    print_hello(); 
     
    cout << endl; 
     
    cout << "The factorial of 5 is " << factorial(5) << endl; 
     
    return 0; 
     
    } 
     
     
     
    //hello.cpp 
     
    #include "functions.h" 
     
    void print_hello()
     
    { 
     
    cout << "Hello World!"; 
     
    } 
     
     
    ///factorial.cpp
     
    #include "functions.h" 
     
    int factorial(int n)
     
    { 
     
    if(n!=1)
     
    { return(n * factorial(n-1)); } 
     
    else return 1; 
     
    } 
     
    //functions.h
     
    void 
     
    print_hello();
     
     int factorial(int n); 

    请将以上文件放到一个目录下。
     

    请注意: 我用的是g++进行编译的,你也可以按照你自己的选择来编译程序

    make的作用

    如果你运行:    make命令, 它将会自动的在你的目录下寻找makefile文件,然后执行它,如果你几个makefile文件,你可以指定某一个特定的makefile文件 使用如下命令:

    make -f  mymakefile

    如果你想知道更多的make 用法,可以执行man  make 命令

    执行过程

    1. 编译器将会编译你的源文件,然后输出目标文件
    2. 链接器执行目标文件然后创建一个可执行文件。
    手动编译  
     

    最不理想的一种执行方式就是

     g++ main.cpp hello.cpp factorial.cpp -o hello

    akefile 基本规则

    makefile的基本规则是有以下构成:

    target: dependencies

    [tab] system command

    利用以上语法编写如下       

    all:

            g++main.cpp hello.cpp factorial.cpp -o hello

    然后运行你的makefile,如下

    make -f Makefile-1

    如上代码叙述,所写的目标是all,all是makefile默认的目标,如果没有其他规定,make语法将要执行这个目标文件。

    我们还发现,all 目标并没有依赖的,所以按照命令让他安全的执行。

    最后,make 通过 我们给的命令进行编译程序

    使用依赖

    这是因为,如果你修改一个单独的文件在你的项目,你不必重新编译一切,只有你修改。 请看下边的例子

    all: hello
     
    hello: main.o factorial.o hello.o
    	g++ main.o factorial.o hello.o -o hello
     
    main.o: main.cpp
    	g++ -c main.cpp
     
    factorial.o: factorial.cpp
    	g++ -c factorial.cpp
     
    hello.o: hello.cpp
    	g++ -c hello.cpp
     
    clean:
    	rm -rf *o hello
    

    我们看到目标all 只有依赖,没有系统命令。为了去执行正确,它必须满足所有的目标所依赖的。目标都回去搜索所有的依赖,然后去执行它。

    在例子中,我们看到了clean的目标,clean 这个目标就是清楚中间生成的.o文件和那些可执行文件

    使用变量和注释

    当你写makefil文件的时候,当你想改变一些编译的一些选项的时候,他是非常有用处的。

    # 这是注释,CC 编译器.
     CC=g++
    # CFLAGS  是选项
    CFLAGS=-c -Wall
    #  目标文件
    OBJECTS=main.o factorial.o hello.o
    all: hello
     
    hello: $(OBJECTS)	
        $(CC) main.o factorial.o hello.o -o hello
     
    main.o: main.cpp
    	$(CC) $(CFLAGS) main.cpp
     
    factorial.o: factorial.cpp
    	$(CC) $(CFLAGS) factorial.cpp
     
    hello.o: hello.cpp
    	$(CC) $(CFLAGS) hello.cpp
     
    clean:
    	rm -rf *o hello
    

    你可以看到,使用这些有时候是非常有用的。你可以使用它们,赋值,当你想改变一些变量值的时候,然后你可以使用$(var),

    来应用这些变量

     

    如何继续下去

    通过以上简要的介绍,你就可以简要的去编写一些更加复杂的makefile来运行你的复杂的程序了。上边讲的只是冰山一角

    ,你可以通过差一些make的文档来写。

    CC=g++
    CFLAGS=-c -Wall
    LDFLAGS=
    SOURCES=main.cpp hello.cpp factorial.cpp
    OBJECTS=$(SOURCES:.cpp=.o)
    EXECUTABLE=hello
     
    all: $(SOURCES) $(EXECUTABLE)
    	
    $(EXECUTABLE): $(OBJECTS) 
    	$(CC) $(LDFLAGS) $(OBJECTS) -o $@
     
    .cpp.o:
    	$(CC) $(CFLAGS) {1}lt; -o $@
  • 相关阅读:
    Selenium 2自动化测试实战
    Python学习笔记整理(python 3)
    Python编程中出现ImportError: bad magic number in 'numpy': b'x03xf3 '
    收集的一些表单常用的正则表达式。
    转载的一篇博客,感觉不错,自我感觉很到位,来自 http://www.cnblogs.com/laizhihui/p/5810965.html
    闲来无写的,就是中间有一条小细线,求大神指点。
    自己总结的有关PHP一些基本知识和一些常见的js问题
    不经意间看到的东西,感觉不错(转载)。
    无束缚版贪吃蛇(就问你爽不爽)
    小图局部放大效果(图片的话就自己找一个吧,记得是一张图片用两次,不是两张图片,而且你的图片不一定与我一样,需改一下放大的尺寸)
  • 原文地址:https://www.cnblogs.com/skyofbitbit/p/3673730.html
Copyright © 2011-2022 走看看