Linux开发工具之编译器gcc/g++

news/2024/5/17 19:11:53 标签: linux, 服务器, gitee

文章目录

  • 1.查看版本
  • 2.程序的翻译
  • 3.gcc指令
    • 3.1gcc hello.c -o hello
    • 3.2gcc -E hello.c -o hello.i
    • 3.3gcc -S hello.c -o hello.s
    • 3.4gcc -c hello.c -o hello.o
    • 3.5gcc hello.o -o hello
  • 4.动静态库[详讲链接阶段]
    • 4.1初步认识
    • 4.2动态链接
    • 4.3静态链接

1.查看版本

gcc -v.
在这里插入图片描述

2.程序的翻译

在这里插入图片描述

3.gcc指令

3.1gcc hello.c -o hello

gcc hello.c -o hello.将名为hello.c的源代码文件编译为可执行文件hello。编译后的可执行文件可以通过运行./hello命令来执行。
gcc hello.c.将名为hello.c的源代码文件编译为可执行文件a.out。编译后的可执行文件可以通过运行./a.out命令来执行。
在这里插入图片描述

3.2gcc -E hello.c -o hello.i

在这里插入图片描述

-E: 进行程序编译 完成预处理后 停止编译
在这里插入图片描述

3.3gcc -S hello.c -o hello.s

在这里插入图片描述

-S: 从当前文件进行程序编译 完成编译阶段 停止编译
在这里插入图片描述

3.4gcc -c hello.c -o hello.o

-c: 从当前文件开始编译 完成汇编阶段 停止编译
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

3.5gcc hello.o -o hello

在这里插入图片描述
在这里插入图片描述

其余指令(了解)

-g 生成调试信息。GNU 调试器可利用该信息。
-shared 尽量使用动态库,生成文件较小[系统有动态库]
-O0/-O1/-O2/-O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
-w 不生成任何警告信息。
-Wall 生成所有警告信息。

4.动静态库[详讲链接阶段]

4.1初步认识

链接方式:

  1. 动态链接— 需要动态库
  2. 静态链接— 需要静态库
    在这里插入图片描述
    在这里插入图片描述

头文件找声明 库里找实现 声明+实现+代码关联起来==>.exe

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Linux: .so(动态库) .a(静态库)
Windows: .dll(动态库) .lib(静态库)

一些指令也是c语言写的

在这里插入图片描述

4.2动态链接

将当前程序会访问到的方法/接口的地址记录在可执行程序中 建立关联

依赖那个动态库 动态库出现错误 当前程序也会出现错误 但是会节省资源

在这里插入图片描述
在学校有些无聊 想要出去上网 问了学长网吧在大北街 从学校翻墙出去到网吧 为了方便逃跑让网管开一台靠窗的机器 结束之后 回到学校继续进行之后的愿望清单
这实际上就是动态链接的过程 那些能在学校里完成的事情 就好比你写的for/while 而printf这种无法在学校完成的库函数需要按照学长的指示去目的地找动态库(网吧)完成 这一来一回就是动态链接

4.3静态链接

将库里面该接口/方法的实现 直接拷贝一份在可执行程序中
举例: 想要上网 不再按照学长的指示去校外 而是买了一台ps5 自己在寝室写完作业当要玩游戏时就可以直接玩

相对动态链接 更安全一些 动态库是否出现错误不影响当前程序 但是可能会重复占用资源(100个含printf的程序同时运行)

我们的库在哪里呢?

服务器下先下载

在这里插入图片描述

在这里插入图片描述

gcc/g++形成的可执行程序默认是动态链接的
ldd打印/查看程序运行所需的共享库,常用来解决程序因缺少某个库文件而不能运行的一些问题。ldd不是一个可执行程序,而只是一个shell脚本

在这里插入图片描述

如何调用静态库?

gcc hello.c -o sthello -static.使用静态链接的方式形成可执行程序(大小是动态链接生成的可执行程序的十几/几十倍甚至更多)在这里插入图片描述


http://www.niftyadmin.cn/n/5165662.html

相关文章

基于geotools24.0的创建自动增长主键id字段的方法

基于geotools24.0的创建自动增长主键id字段的方法 原始引入的包中有bug,一直返回fid主键的问题 protected String findPrimaryKeyColumnName(SimpleFeatureType featureType) {String[] suffix new String[] {"", "_1", "_2"};String[] base …

【学习笔记】CF1651F Tower Defense

首先转换一下题意。令 c u r i cur_i curi​表示第 i i i个塔当前的魔力,每次操作,我们将过程描述为: 对于每个 i i i, c u r i : min ⁡ ( a i t ⋅ r i , c i ) cur_i:\min(a_it\cdot r_i,c_i) curi​:min(ai​t⋅ri​,ci​)…

自考改革过渡期!广东小自考最优解只需要2门笔试

图片来源:广东省考试院* 近期广东教育考试院公布了自考专业调整的相关通知,新的专业考试计划从2026年1月起执行。 这次改革过渡期中有一个重大利好消息,小自考专业笔试统考科目最少只需考2门笔试! 这是为什么呢? 小…

Verilog刷题[hdlbits] :Vector100r

题目:Vector100r Given a 100-bit input vector [99:0], reverse its bit ordering. 给定一个100位输入向量[99:0],反转它的位顺序。 Hint… 提示…… A for loop (in a combinational always block or generate block) would be useful here. I wo…

【数据结构】链表经典OJ题,常见几类题型(一)

目录 题型一:反转单链表思路解析OJ题实例解题代码 题型二:快慢指针思路解析OJ题实例解题代码 两类题型的结合 题型一:反转单链表 思路解析 反转一个链表主要是想让第一个节点指向NULL,第二个节点指向第一个,以此类推。…

leetCode 解法集锦

分类方法: 博弈(对手转化为当前、位运算,计算两者之差) 奇数偶数决定 决策数字到可选1,然后是倍数。 计算方法: hash 双指针 原地存储(原地取反)、字符串处理 二分 求和:前缀和字典; 左前缀和右…

IntelliJ IDEA 2023.2.1 (Ultimate Edition) 版本 Git 如何合并多次的本地提交进行 Push

本心、输入输出、结果 文章目录 IntelliJ IDEA 2023.2.1 (Ultimate Edition) 版本 Git 如何合并多次的本地提交进行 Push前言为什么需要把多次本地提交合并合并提交的 2 种形式:事中合并、事后合并事中合并事后合并:支持拆分为多组提交弘扬爱国精神IntelliJ IDEA 2023.2.1 (U…

自动驾驶算法(九):多项式轨迹与Minimun Snap原理与Matab代码详解

目录 1 为什么需要轨迹优化 2 代码解析 3 完整代码 1 为什么需要轨迹优化 我们利用前八篇所学的博客可以利用RRT、A*、遗传算法等设计出一条折线轨迹,轨迹优化就是在路径优化的基础上将折线优化成曲线,这样更加有利于无人机的飞行。 那么什么是多项式轨…