• Linux学习笔记:gcc和makefile简单使用


    gcc和make

    gcc

    gcc是C,C++,Objective-C的编译工具。一般程序想要运行,必须编译为机器可以运行的文件。

    常用指令作用
    gcc -o file将输出放在file文件中,生成可执行文件
    gcc -c生成目标文件.o
    gcc -I dir在指定目录搜索头文件

    当.c文件和使用的.h文件在一个目录下时(不包括标准目录的头文件)
    比如:

    $ tree
    .
    ├── main.c
    └── system.h
    
    0 directories, 2 files
    #main.c中调用了system.h的宏定义TIME=10
    #main.c输出宏定义TIME
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    直接可以使用gcc -o生成可执行文件,也可以先gcc -c生成.o文件,再gcc -o生成可执行文件:

    $ gcc main.c -o prog
    $ ls
    main.c	prog  system.h
    $ ./prog
    time=10
    或者
    $ gcc -c main.c
    $ gcc main.o -o prog
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    如果有多个.c,则使用gcc 1.c 2.c -o prog
    当.c文件和使用的.h文件不在一个目录下时(不包括标准目录的头文件)

    $ tree
    .
    ├── main.c
    └── system
        └── system.h
    
    1 directory, 2 files
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    此时如果直接输入$ gcc main.c -o prog,会出现错误。(找不到system.h这个文件)

    main.c:2:10: fatal error: system.h: No such file or directory
        2 | #include "system.h"
          |          ^~~~~~~~~~
    compilation terminated.
    
    • 1
    • 2
    • 3
    • 4

    这时候必须输入gcc -I system/ main.c -o prog,即先用-I指定文件所在头文件的目录,比如system.h在system里面。

    $ gcc -I system/ main.c -o prog
    $ ls
    main.c	prog  system
    $ ./prog
    time=10
    或者
    $ gcc -I system/ -c main.c
    $ gcc main.o -o prog
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    makefile

    make的主要功能是,执行生成新版本的目标程序所需的个步骤,即自动检测一个大型程序的哪一部分需要重新编译,然后发出命令,重新编译它们,主要是需要创建以一个makefile文件来连接他们,makefile文件通常以makefileMakefile,GNUmakefile命名。
    makefile文件遵循的格式:

    目标文件:[相依文件...]
    命令[#注释]
    目标文件:[相依文件...]
    命令[#注释]
    ...
    
    • 1
    • 2
    • 3
    • 4
    • 5

    注意:的意思是在命令前面按一下键盘的tab键!!!
    不然你makefile文件就是一个错误格式的文件,运行会报错。

    举个makefile的栗子:
    prog由main.o产生,main.o由main.c产生,
    另外一行就是对应的生成命令。

    prog:main.o
    	gcc main.o -o prog
    main.o:main.c
    	gcc main.c -c
    
    • 1
    • 2
    • 3
    • 4

    当.h文件和.c文件都在一个目录下时
    当前目录下

    $ tree
    .
    ├── add.c
    ├── add.h
    ├── main.c
    ├── subtract.c
    ├── subtract.h
    └── system.h
    
    0 directories, 6 files
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    依赖关系为:

    main.csystem.h add.c subtract.c
    system.hadd.h subtract.h
    add.cadd.h
    subtract.csubtract.h

    现在写一个makefile来编译生成prog。

    prog:main.o add.o subtract.o
            gcc main.o add.o subtract.o -o prog
    main.o:main.c system.h
            gcc -c main.c
    add.o:add.c
            gcc -c add.c
    subtract.o:subtract.c
            gcc -c subtract.c
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    运行结果:

    $ make
    gcc -c main.c
    gcc -c add.c
    gcc -c subtract.c
    gcc main.o add.o subtract.o -o prog
    $ ls
    Makefile  add.h  main.c  prog	     subtract.h  system.h
    add.c	  add.o  main.o  subtract.c  subtract.o
    $ ./prog
    num1=3,num2=1$ 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    当.c和.h文件不在同一个目录下时:

    $ tree
    .
    ├── main.c
    └── my_math
        ├── my_math.c
        └── my_math.h
    
    1 directory, 3 files
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    依赖关系为:

    main.cmy_math.c my_math.h
    my_math.cmy_math.h

    现在写一个makefile来编译生成prog。

    prog:main.o my_math.o
            gcc my_math.o main.o -o prog
    main.o:main.c my_math/my_math.h
            gcc -I my_math/ -c main.c
    my_math.o:my_math/my_math.c
            gcc -c my_math/my_math.c
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    运行结果为:

    $ make
    gcc -I my_math/ -c main.c
    gcc -c my_math/my_math.c
    gcc my_math.o main.o -o prog
    $ ls
    Makefile  main.c  main.o  my_math  my_math.o  prog
    $ ./prog
    num1=3,num2=1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 相关阅读:
    debugserver+lldb连接不上的解决办法
    【办公类-16-05-02】“大班游戏活动室排班表——领导版8周”(python 排班表系列)
    [OpenCV-dlib]人脸识别功能拓展-通过随机要求头部动作实现活体检测
    netapp3210存储更换故障硬盘过程
    工业无线呼叫安灯(Andon)系统上线须知
    异地办公也能畅快、无限制远程访问公司内网的解决方案
    《uni-app》一个非canvas的飞机对战小游戏-启动页
    CDGA数据治理工程师考试心得
    仙人掌之歌——大规模高速扩张(2)
    java计算机毕业设计甜趣网上蛋糕店订购系统源码+系统+数据库+lw文档+mybatis+运行部署
  • 原文地址:https://blog.csdn.net/darlingqx/article/details/127515644