【Linux】03 GCC编译器的使用

这篇具有很好参考价值的文章主要介绍了【Linux】03 GCC编译器的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、编译过程

 在使用gcc编译程序时,编译过程可以简要划分为4个阶段:

        预处理、编译、汇编、链接

1.1 预处理(preprocessing)

这个阶段主要处理源文件中的#indef、#include和#define预处理命令;
这里主要是把一些include的头文件和一些宏定义,放到源文件中。

编译命令:gcc  -E  -o  hello.i  hello.c

【Linux】03 GCC编译器的使用,linux

 1.2 编译(compilation)

将经过预处理文件(test.i)之后的程序转换成特定汇编(test.s)代码

 编译命令:gcc  -S  -o  hello.s  hello.i

【Linux】03 GCC编译器的使用,linux

1.3 汇编(assembly)

汇编过程将上一步的汇编代码转换成机器码,这一步产生的文件叫做目标文件,是二进制格式

编译命令: gcc  -c  -o  hello.o  hello.s

【Linux】03 GCC编译器的使用,linux

1.4 链接(linking) 

链接过程使用链接器将该目标文件与其他目标文件、库文件、启动文件等链接起来生成可执行文件。附加的目标文件包括静态连接库和动态连接库。

编译命令:gcc  -o  hello  hello.o 

【Linux】03 GCC编译器的使用,linux

 二、 常用编译选项

2.1 -c

        预处理、编译和汇编源文件,但是不作链接,编译器根据源文件生成 OBJ 文件。缺省情况下, GCC 通过用`.o'替换源文件名的后缀`.c', `.i', `.s'等,产生 OBJ 文件名。可以使用-o 选项选择其他名字。 GCC 忽略-c 选项后面任何无法识别的输入文件

2.2 -S

         编译后即停止,不进行汇编。对于每个输入的非汇编语言文件,输出结果是汇编语言文件。缺省情况下, GCC 通过用`.s'替换源文件名后缀`.c', `.i'等等,产生汇编文件名。可以使用-o 选项选择其他名字。 GCC 忽略任何不需要汇编的输入文件

2.3 -E

        预处理后即停止,不进行编译。预处理后的代码送往标准输出 

2.4 -o file

        指定输出文件为 file。无论是预处理、编译、汇编还是链接,这个选项都可以使用。如果没有使用`-o'选项,默认的输出结果是:可执行文件为`a.out';修改输入文件的名称是`source.suffix',则它的 OBJ 文件是`source.o',汇编文件是 `source.s',而预处理后的 C 源代码送往标准输出。 

2.5 -v 

显示制作 GCC 工具自身时的配置命令;同时显示编译器驱动程序、预处理器、编译器的版本号

2.6 -Wall

打开了所有需要注意的警告信息,比如没有指定类型的声明、在声明之前就使用的函数、局部变量除了声明就没再使用等 

2.7 -g

以操作系统的本地格式(stabs, COFF, XCOFF,或 DWARF)产生调试信息, GDB 能够使用这些调试信息 

2.8 -O、-O1、-O2、-O3

优化:对于大函数,优化编译的过程将占用稍微多的时间和相当大的内存 

-O:不优化

-O1:优化一些

-O2:多优化一些

-O3:优化的更多

2.9 -llibrary

链接名为 library 的库文件。链接器在标准搜索目录中寻找这个库文件,库文件的真正名字是`liblibrary.a' 

2.10 -nostartfiles 

不链接系统标准启动文件,而标准库文件仍然正常使用 

2.11 -nostdlib

不链接系统标准启动文件和标准库文件,只把指定的文件传递给链接器 

2.12 -static 

在支持动态链接(dynamic linking)的系统上,阻止链接共享库 

2.13 -shared 

生成一个共享 OBJ 文件,它可以和其他 OBJ 文件链接产生可执行文件 

2.14 -Idir 

在头文件的搜索路径列表中添加 dir 目录 

2.15 -I ( i 的大写)

指定头文件路径(相对路径或绝对路径,建议相对路径) 

2.16 -L 

指定连接的动态库或者静态库路径(相对路径或绝对路径,建议相对路径) 

2.17 -fPIC

用于生成位置无关的代码(Position-Independent-Code),可以使得动态库可以被多个程序共享 

三、库的制作与使用

3.1 制作、使用动态库

1.将源文件进行汇编操作,需要使用参数 -c, 还需要添加额外参数 -fpic /-fPIC

gcc 源文件(*.c) -c -fPIC

2. 将得到的.o 文件打包成动态库,还是使用 gcc, 使用参数 -shared 指定生成动态库  

gcc -shared 与位置无关的目标文件(*.o) -o 动态库(libxxx.so) 

3.  编译APP

gcc -o test main.o -lsub -L /libsub.so/所在目录/

 4. 使用APP

  • 先把 libsub.so 放到 Ubuntu 的/lib 目录,然后就可以运行 test 程序
  • 如果不想把 libsub.so 放到/lib,也可以放在某个目录比如/a,然后执行 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/a

 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./

./test文章来源地址https://www.toymoban.com/news/detail-809723.html

3.2 制作、使用静态库

1.将源文件进行汇编操作,需要使用参数 -c, 还需要添加额外参数 -fpic /-fPIC

gcc 源文件(*.c) -c -fPIC

2.  将得到的.o 文件打包成动态库,使用 ar指令生成静态库

ar  crs  静态库(libxxx.so)   与位置无关的目标文件(*.o)

3.  编译APP

gcc -o test main.o -lsub -L /libsub.a/所在目录/

 4. 使用APP

./test

到了这里,关于【Linux】03 GCC编译器的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux】Linux编译器 gcc/g++的使用&&初识动静态链接库

    ​ ​📝个人主页:@Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:Linux 🎯 长路漫漫浩浩,万事皆有期待 上一篇博客:【Linux】Linux环境基础工具的基本使用及配置(yum、vim) 在上一篇 Linux 博客中,我们讲解了 vim 编辑器的使用,可以在 Linux 上写

    2024年02月11日
    浏览(43)
  • 【Linux】Linux编译器 gcc 的使用 | 动静态库的初步认识

    👑作者主页:@安 度 因 🏠学习社区:StackFrame 📖专栏链接:Linux

    2024年01月15日
    浏览(29)
  • 【Linux】编译器-gcc/g++与调试器-gdb的使用

    👀 樊梓慕: 个人主页  🎥 个人专栏: 《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C++》《Linux》 🌝 每一个不曾起舞的日子,都是对生命的辜负 目录 前言 1.gcc/g++语法 2.gcc的使用及编译器是如何\\\"翻译\\\"代码的? (1)预处理 (2)编译 (3)汇编

    2024年02月04日
    浏览(49)
  • 【Linux】编译器gcc和g++与调试器gdb的使用

    我们知道,一个程序被运行起来之后需要经历四个阶段然后才变成一个可执行的程序,他们分别为:预处理,编译,汇编和链接。下面我们将介绍这四个阶段的操作,测试代码如下: 1.1 预处理 预处理也叫预编译,程序在预处理阶段会完成如下操作: 展开头文件,将头文件中

    2024年02月07日
    浏览(33)
  • 【探索Linux】—— 强大的命令行工具 P.4(编译器 gcc/g++ 使用)

    前面我们讲了C语言的基础知识,也了解了一些数据结构,并且讲了有关C++的一些知识,也学习了一些Linux的基本操作,也了解并学习了有关Linux开发工具vim ,也相信大家都掌握的不错,今天博主带大家了解一下Linux编译器 gcc/g++ 使用, 下面话不多说坐稳扶好咱们要开车了!!

    2024年02月12日
    浏览(46)
  • Linux:编译器 - gcc

    GCC(英文全拼:GNU Compiler Collection)是 GNU 工具链的主要组成部分,是一套以 GPL 和 LGPL 许可证发布的程序语言编译器自由软件,由 Richard Stallman 于 1985 年开始开发。 gcc是GCC中的C语言编译器,而g++是GCC中的C++编译器。本博客只讲解gcc,g++的语法和选项和gcc都是一致的。 gcc 编译

    2024年04月14日
    浏览(69)
  • Linux GCC常用命令以及GCC编译器

    GCC 是编译工具,它的意思是 GNU C Compiler 。经过了这么多年的发展,GCC 已经不仅仅能支持 C 语言;它现在还支持 Ada 语言、C++ 语言、Java 语言、Objective C 语言、Pascal 语言、COBOL语言,以及支持函数式编程和逻辑编程的 Mercury 语言等等。而 GCC 也不再单只是 GNU C 语言编译器的意

    2024年02月05日
    浏览(37)
  • Linux编译器gcc/g++

    以gcc编译 以g++编译,但是此时会发现没有g++这个指令,所有需要安装它,安装指令 yum install gcc gcc-c++ gcc和g++都会形成可执行文件a.out gcc只能编译c语言代码,g++能编译c/c++ 以c程序为例,来看看它从一个文本类的c程序编译成计算机可以认识的二进制程序它需要经过四个阶段 预

    2024年02月10日
    浏览(35)
  • Linux——gcc/g++编译器

    目录 I.Linux编译器 1.gcc/g++编译器 在C代码生成可执行程序的过程中,会有四个过程: 1预处理,2编译,3汇编,4链接 Linux对.c文件分辨进行预处理,编译,汇编三大步指令: 预处理指令: 编译指令: 汇编指令: 接下来说一说链接过程: II.动静态链接  一.动态链接 二.静态链接

    2024年02月04日
    浏览(39)
  • 《Linux从练气到飞升》No.05 Linux编译器gcc/g++的使用及编译过程 【云边有个小卖部】上新

    🕺作者: 主页 我的专栏 C语言从0到1 探秘C++ 数据结构从0到1 探秘Linux 菜鸟刷题集 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇 码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要,有问题可在评论区提出,感谢阅读!!! 本篇我们将讲述gcc/g++的使用以及它是如何完成一

    2024年02月14日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包