zoukankan      html  css  js  c++  java
  • Linux中gcc命令详解以及Makefile文件编写

    本篇文章并不讨论cc和gcc还有g++的区别,他们之间的关系,https://blog.csdn.net/CodeHeng/article/details/41242349这篇文章说的很清楚,本篇文章单纯来说gcc的用法:

    1、gcc命令:

    (1)gcc hello.c

    这个命令是编译并且链接hello.c文件,并且生成a.out的可执行文件,之后运行a.out可执行文件就可以了。

    (2)gcc -c hello.c 

    这个命令是只对hello.c文件进行编译,并不进行后续的链接工作,编译完成后,会生成hello.o的目标文件。

    (3)gcc -o hello hello.o

    这个命令是对hello.o目标文件进行链接,生成名为hello的可执行文件

    上面的栗子都是在文件是一个的基础上,但是一个大的工程一半都有很多文件组成,那么这时候改怎么来在Linux环境下进行编译呢???命令是类似的。

    (4)gcc -c thanks.c thanks2.c

    和命令(2)类似,这个命令是对thanks.c和thanks2.c进行编译,进行语法检查,生成thanks.o和thanks2.o的目标文件。

    (5)gcc -o thanks thanks.o thanks2.o

    和命令(3)类似,这个命令是对thanks.o 和thankx2.o 进行链接,生成thanks的可执行二进制文件。

    上面只是以两个文件为例,但是如果我们有很多个文件,那么每次都要输入那么多命令,会很麻烦,如果你足够了解Linux命令,那么可以用shell文件来解决,但是如果工程很大呢?每次编译都要很长时间来完成,但是你每次都只是改动一个很小的地方,花费那么长的时间去编译,很不值得,因此,我们需要编写Makefile文件来解决以上问题:

    2、Makefile文件的编写:

    (1)Makefile文件的基本语法与变量:

    目标(target):目标文件1 目标文件2

    <tab> gcc -o 欲新建的可执行文件 目标文件1 目标文件2

    目标(target)就是我们想要建立的信息,而目标文件就是具有相关性的 object files 那建立可执行文件的语法忽悠上古以<tab>按键开头的那一行

    注意:命令行必须以tab键作为开头才行

    (2)规则:

    在Makefile文件中,#代表批注

    <tab>键需在命令行的第一个字符

    目标(target)与相关文件(就是目标文件)之间需要以“:”隔开

    实例:

    main: main.o haha.o sin_value.o cos_value.o

      gcc -o main main.o haha.o sin_value.o cos_value.o -lm

    clean:

      rm -f main main.o hah.o sin_value.o cos_value.o

    在第二行中,-lm表示调用libm.a函数库,lib和.a 省略不写

    输入命令:make clean

    则执行第四行

    可以看到,上面的Makefile文件重复的数据很多,一个一个写起来还是很繁琐,既然Makefile文件类似于shell script,那么我们是不是可以将shell中的变量的概念引入呢?

    LIBS = -lm

    OBJS = main.o haha.o sin_value.o cos_value.o

    main: ${OBJS}

      gcc -o main ${OBJS} ${LIBS}

    clean:

      rm -f main ${OBJS}

    调用的命令跟上一个Makefile文件是一样的。

    为了输出详细的编译信息,我们可以给加上-Wall参数,在上面的Makefile文件的第三行后加上一行,CFLAGS = -Wall,就可以看到详细的编译信息

  • 相关阅读:
    python基础
    用纯css改变下拉列表select框的默认样式兼容ie9需要用js
    如何阻止360浏览器backspace键的默认快捷键
    js判断undefined类型,undefined,null, 的区别详细解析
    jquery事件日历插件e-calendar 的修改
    each和for一起使用
    2019.9.24 网络ip小知识
    数据库SQL开始学习_5
    2019.9.22 java小知识
    数据库SQL开始学习_4
  • 原文地址:https://www.cnblogs.com/PIRATE-JFZHOU/p/8922508.html
Copyright © 2011-2022 走看看