【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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux 部署

jdk&tomcat安装 1.上传jdk、tomcat安装包 2.解压两个工具包 #解压tomcat tar -zxvf apache-tomcat-8.5.20.tar.gz #解压jdk tar -zxvf jdk-8u151-linux-x64.tar.gz 3.配置并且测试jdk安装 #配置环境变量 vim /etc/profile #java environment export JAVA_HOME/root/soft/…

【手撕C语言 第五集】分支和循环(下)

for循环 我们已经知道了while循环,但是我们为什么还要一个for循环呢? 首先来看看for循环的语法: 表达式1 表达式1为初始化部分,用于初始化循环变量的。 表达式2 表达式2为条件判断部分,用于判断循环时候终止。 表达式…

《仙剑4》、《仙剑6》双“空降”,这一次,网友的评论“真相了!”

“本以为《仙剑1》只是国产仙侠剧的起点,结果却没想到,它却真正意义上成为了巅峰。” 这一次,网友的评论“真相了!” 先说《仙剑四》,这部据说耗资3.4亿的大制作,奈何笔者实在看不出它的“含金量”&#x…

2023 IoTDB Summit:湖南大唐先一科技有限公司主任架构师舒畅《IoTDB 在发电领域的应用实践》...

12 月 3 日,2023 IoTDB 用户大会在北京成功举行,收获强烈反响。本次峰会汇集了超 20 位大咖嘉宾带来工业互联网行业、技术、应用方向的精彩议题,多位学术泰斗、企业代表、开发者,深度分享了工业物联网时序数据库 IoTDB 的技术创新…

Deepin_Ubuntu_查看树形目录结构(tree)

Linux系统(Deepin、Ubuntu)中,可以使用tree命令来查看树形目录结构,下面是一些示例: 查看当前目录的树形结构: tree查看指定目录的树形结构,例如/etc/X11/fonts目录: tree /etc/X…

PSoc62™开发板之i2c通信

实验目的 使用模拟i2c接口读取温湿度气压模块BME280数据 实验准备 PSoc62™开发板温湿度气压模块BME280公母头杜邦线 板载资源 本次实验是通过模拟i2c时序的方式来进行通信,理论上可以有非常多的方式配置i2c引脚,不像硬件i2c那样芯片出厂引脚已经固…

C# Cad2016二次开发选择csv导入信息(七)

//选择csv导入信息 [CommandMethod("setdata")] //本程序在AutoCAD的快捷命令是"DLLLOAD" public void setdata() {Microsoft.Win32.OpenFileDialog dlg new Microsoft.Win32.OpenFileDialog();dlg.DefaultExt ".csv";// Display OpenFileDial…

1.php开发-个人博客项目文章功能显示数据库操作数据接收

(2022-day12) #知识点 1-php入门,语法,提交 2-mysql 3-HTMLcss ​ 演示案例 博客-文章阅读功能初步实现 实现功能: 前端文章导航,点入内容显示,更改ID显示不同内容 实现步骤&#xff1…

idea 连接docker

idea 连接docker步骤 services --> docker connection --->tcp://192.168.21.128:2375 修改docker配置 vi /usr/lib/systemd/system/docker.service 在ExecStart/usr/bin/dockerd -H fd:// --containerd/run/containerd/containerd.sock 后面加上 -H tcp://0.0.0.0:23…

matlab多元线性回归

1.matlab多元回归示例如下: 解决问题:油价预测 方法:多元线性回归 实现:matlab regress()函数 技巧:通过增加X1^2,X2^2,或者X1*X2等构造的特征项,可以提高回归模型的拟合准确度&…

CMake 实战构建TcpServer项目 静态库/动态库

爱编程的大丙CMake: 20. 举例 - 下_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV14s4y1g7Zj?p20&spm_id_frompageDriver&vd_sourcea934d7fc6f47698a29dac90a922ba5a3 hehedalinux:~/Linux/LinuxServerCpp$ ls Buffer.cpp Log.h Buffe…

RK3566 linux加入uvc app

SDK中external/uvc_app/目录提供了将板卡模拟成uvc camera的功能。 一、buildroot使能uvc_app 1、进入到buildroot目录 在sdk目录下执行以下命令: cd buildroot 2、选择defconfig 执行命令: source build/envsetup.sh 输入数字然后回车选择板卡&…

qt学习:实战 读取txt文件+定时器点名

目录 目标 步骤 头文件 配置ui界面 在.h里定义槽函数和字符串链表和定时器指针 在构造函数里读取txt文件并初始化定时器 开始按钮点击函数 开始定时器 停止按钮点击函数 关闭定时器 定时器槽函数 目标 两个按钮,一个开始点名,一个停止点名一个…

我在代码随想录|写代码Day10之双指针19. 删除链表的倒数第 N 个结点,面试题 02.07. 链表相交,142. 环形链表 II

博主介绍: 27dCnc 专题 : 数据结构帮助小白快速入门 👍👍👍👍👍👍👍👍👍👍👍👍 ☆*: .。. o(≧▽≦)o .。.:*☆ …

UVa1318/LA2797 Monster Trap

题目链接 本题是2003年ICPC亚洲区域赛会津(日本)赛区的H题 题意 给出一些线段障碍,你的任务是判断怪物能否逃到无穷远处。如下图所示,左图无法逃出,右图的可以逃出。 输入包含多组数据。每组数据第一行为整数n(1≤n≤100&#xf…

[C#]C# winform部署yolov8目标检测的openvino模型

【官方框架地址】 https://github.com/ultralytics/ultralytics 【openvino介绍】 OpenVINO(Open Visual Inference & Neural Network Optimization)是由Intel推出的,用于加速深度学习模型推理的工具套件。它旨在提高计算机视觉和深度学…

【漏洞复现】Hikvision SPON IP网络对讲广播系统命令执行漏洞(CVE-2023-6895)

文章目录 前言声明一、系统简介二、漏洞描述三、影响版本四、漏洞复现五、修复建议 前言 Hikvision Intercom Broadcasting System是中国海康威视(Hikvision)公司的一个对讲广播系统。 声明 请勿利用文章内的相关技术从事非法测试,由于传播…

C++PythonC# 三语言OpenCV从零开发(2):教程选择

文章目录 相关专栏前言视频教学和官方文档视频教程OpenCV 官方教程最终选择我的最终选择 相关专栏 C&Python&Csharp in OpenCV 前言 OpenCV 有官方的教程和简单的视频教程: OpenCV 官方教程 B站也有相关的视频教学 OpenCV4 C 快速入门视频30讲 - 系列合集 …

AI短视频制作:创意与技术的完美结合

文章目录 一、充分了解AI技术的应用范围和优势二、创意策划,确定作品主题和风格三、素材收集,丰富作品内容四、特效制作,提升作品视觉效果五、配音处理,增强作品表现力六、作品发布,扩大作品传播范围《AI短视频制作一本…

关于大模型学习中遇到的3

来源:网络 Embedding模型 随着大型语言模型的发展,以ChatGPT为首,涌现了诸如ChatPDF、BingGPT、NotionAI等多种多样的应用。公众大量地将目光聚焦于生成模型的进展之快,却少有关注支撑许多大型语言模型应用落地的必不可少的Embed…