【Linux】03 GCC编译器的使用

一、编译过程

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

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

1.1 预处理(preprocessing)

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

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

 1.2 编译(compilation)

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

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

1.3 汇编(assembly)

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

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

1.4 链接(linking) 

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

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

 二、 常用编译选项

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/416555.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker(三)使用 Docker 镜像:从仓库获取镜像;管理本地主机上的镜像;介绍镜像实现的基本原理

作者主页: 正函数的个人主页 文章收录专栏: Docker 欢迎大家点赞 👍 收藏 ⭐ 加关注哦! 使用 Docker 镜像 在之前的介绍中,我们知道镜像是 Docker 的三大组件之一。 Docker 运行容器前需要本地存在对应的镜像&#x…

蓝桥杯备战 每日一题 (2)

今天的题目是回忆迷宫 这个题目我们来熟悉一下 弗洛伊德算法 的代码模板 弗洛伊德算法用来处理最短路径问题 弗洛伊德算法(Floyd’s algorithm)用于解决图中所有节点对之间的最短路径问题。算法的基本思路是通过逐步迭代更新节点对之间的最短路径长度&a…

linux C语言socket函数recv

recv 函数是在 Linux C 语言网络编程中用于从已连接的套接字接收数据的函数。它通常与 TCP 连接一起使用,但也可以用于 UDP(尽管对于 UDP,更常使用 recvfrom,因为它还可以接收发送方的地址信息)。 函数原型 recv 函数…

手机与电脑更改IP地址怎么使用代理IP?

在现代互联网时代,代理IP已成为许多人日常生活和工作中不可或缺的一部分。通过代理IP,用户可以隐藏自己的真实IP地址,并获得更好的网络体验。本文将详细介绍如何在手机和电脑上更改IP地址并使用代理IP。 一、手机使用代理IP 1. 打开手机设置&…

00-Rust前言

问:为什么要近期想学习Rust? 答: Rust出来也是有一段时间了,从Microsoft吵着要重构他们的C"祖传代码"开始,Rust就披着“高效,安全”的头衔。而自己决定要学习Rust,是因为近期发现:与…

【GAMES101】Lecture 08 图形管线(实时渲染管线)与纹理映射

目录 图形管线 纹理映射 图形管线 给我一个三维模型,给我一个光照条件,我就能够得出渲染的结果,这些东西合起来就是Graphics Pipeline,图形管线,闫神愿称之为实时渲染管线,那下面这个流程图就是这个渲染…

Ps:智能对象

智能对象 Smart Objects可以理解为一个存放图像数据的容器,容器中可以包含像素图像、矢量图像、滤镜效果等。 在 Photoshop 中,将图层转换为智能对象之后,则可以以非破坏性的方式工作,操作的灵活性也更强。 请参阅: 《…

YOLOv8改进 | 进阶实战篇 | 利用YOLOv8进行视频划定区域目标统计计数

一、本文介绍 Hello,各位读者,最近会给大家发一些进阶实战的讲解,如何利用YOLOv8现有的一些功能进行一些实战, 让我们不仅会改进YOLOv8,也能够利用YOLOv8去做一些简单的小工作,后面我也会将这些功能利用PyQt或者是pyside2做一些小的界面给大家使用。 在开始之前给大家推…

Visual Studio中,每次新建文件都会自动出现提前设置好的头文件配置方法

主要是修改 newcfile.cpp 文件,可以用everything或者Listary等软件直接搜索文件,直接跳到第4步 1.图标右击——>打开文件所在位置 2.到达IDE地址后在当前目录下找VC文件夹 3.再找 VCProjectItems 文件夹——newcfile.cpp文件 4.用记事本打开&#xff…

Bit.Store 加密卡集成主流 BRC20 ,助力 BTC 生态 Token 的流动性与消费

“Bit.Store 首创性的将包括 ORDI、SATS、以及 RATS 在内的主流 BRC20 资产集成到其加密卡支付中,通过以其推出的加密银行卡为媒介,助力 BTC 生态 Token 的流动性与消费。” 比特币网络在被设计之初,就是以一种去中心化、点对点的现金系统为定…

深耕文档型数据库12载,SequoiaDB再开源

1月15日,巨杉数据库举行SequoiaDB新特性及开源项目发布活动。本次活动回顾了巨杉数据库深耕JSON文档型数据库12年的发展历程与技术演进,全面解读了SequoiaDB包括在高可用、安全、实时、易用性四个方向的技术特性,宣布了2024年面向技术社区的开…

【RT-DETR有效改进】华为 | Ghostnetv1一种专为移动端设计的特征提取网络

前言 大家好,这里是RT-DETR有效涨点专栏。 本专栏的内容为根据ultralytics版本的RT-DETR进行改进,内容持续更新,每周更新文章数量3-10篇。 专栏以ResNet18、ResNet50为基础修改版本,同时修改内容也支持ResNet32、ResNet101和PP…