[Linux笔记]gcc/g++,动静态库,make/makefile/.PHONY

news2024/11/25 13:31:59

都是编译器,二者的选项是重叠的
基本上,gcc专门用于编译c,g++专门用于编译c++
gcc/g++形成的可执行程序默认是release版的。若要debug版,则使用-g选项。
如:gcc -o mytest test.c -g -std=c99

编译命令格式例:
gcc 选项 要编译的文件 选项 目标文件
头文件与源文件位于同一路径下时,gcc只需要包含源文件,多个源文件使用空格隔开

编译过程:
预处理(宏替换等)
预处理功能主要包括宏定义,文件包含,条件编译,去注释等。
预处理指令是以#号开头的代码行。
实例: gcc –E hello.c –o hello.i
选项-E的作用是让 gcc 在预处理结束后停止编译过程。选项-o是指目标文件,“.i”文件为已经过预处理的C原始程序。
编译(翻译成汇编)
在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。
用户可以使用-S选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
实例: gcc –S hello.i –o hello.s
汇编(生成机器码)
汇编阶段是把编译阶段生成的“.s”文件转成目标文件
在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了
例: gcc –c hello.s –o hello.o
链接(生成可执行文件或库文件)
在成功编译之后,就进入了链接阶段。
例: gcc hello.o –o hello

这里涉及一个重要概念:函数库
我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢?
答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用

库是在链接的时候使用的
动态和静态的区别在于链接阶段处理库的方式
静态 把库中的需要的方法直接拷贝到程序中,拷贝后(静态链接成功后)不再依赖原库
动态 将库中的需要的方法的地址拷贝到程序中,程序调用方法时需要根据地址在原库中寻找方法
这两种处理方式分别被称为静态链接方式和动态链接方式,
用静态库比较容易浪费空间(与动态链接的程序相比体积大一百倍左右算正常的),用动态库比较依赖原库的存在
静态库专门用于让编译器对用户的程序进行静态链接,
动态库专门用于让编译器对用户的程序进行动态链接
windows:动态库为.dll,静态库为.lib
linux:动态库.so,静态库.a,默认使用动态链接
使用file指令可查看文件类型与详细属性,对可执行程序使用可以看到链接方式:

若要指定使用静态链接,则在链接命令最后加 -static

一般的云服务器默认只有动态库,可能无法执行-static,
,安装c与c++静态库:yum install glibc-static libstdc++-static -y
ldd指令是list dynamic dependencies的缩写,意思是列出动态库依赖关系,
对静态链接的可执行文件使用则会提示该文件非动态:

make与makefile
make是一个命令
makefile是一个文件,需要创建在当前源代码路径下,
通过编辑该文件,可以实现自动化构建代码。

makefile是一个围绕依赖关系和依赖方法构建的自动化编译工具
在这里插入图片描述

myfile:myfile.c是依赖关系,意思是要用依赖文件myfile.c生成目标文件myfile
后续内容是依赖方法
依赖关系中,目标文件对应的依赖文件列表可以为空
指令:
make myfile
make clean
可使用对应方法
正确的依赖关系配合正确的依赖方法才能完成一件事

.PHONY
重复执行编译时会提示已为最新:
在这里插入图片描述
若需要强制重复执行应使用.PHONY修饰相应方法:
在这里插入图片描述

.PHONY修饰的方法总是会被执行,被修饰的符号称为伪目标
通常clean会需要总是执行,而编译并不需要
判断可执行程序是否最新,是通过对比源代码文件与可执行文件的修改时间的先后来实现的

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MYSQL-死锁大集合

为什么会死锁 数据准备 建个表 CREATE TABLE t_order (id int NOT NULL AUTO_INCREMENT,order_no int DEFAULT NULL,create_date datetime DEFAULT NULL,PRIMARY KEY (id),KEY index_order (order_no) USING BTREE ) ENGINEInnoDB ; 存个数据 然后我们分别创建两个事务 事…

【多模态】16、DetCLIP | 构建超大词汇字典来进行开放世界目标检测

论文:DetCLIP: Dictionary-Enriched Visual-Concept Paralleled Pre-training for Open-world Detection 代码:无。。。 出处:NIPS2022 | 华为诺亚方舟 | 中山大学 | 香港科技大学 效果: 在 LVIS 的 1203 个类别上超越了 GLIP…

每月进度总结 7月1日~7月22日

一个月已经过了三分之二了,感觉这个月是在学校学的很多。也是最充实的三个星期。其中也有发呆,也有过懊悔,今天状态为什么这么差,就学了这一点。但是还有学到知识的喜悦。总之是认识到了自己的很多不足,也找到了相对正…

conda在D盘创建虚拟环境

1.安装Anaconda 略 2.修改镜像源 清华的镜像源好像不能用了。交大的镜像源还能使用。 winr 输入: %HOMEPATH% 进入C盘的用户目录。找到.condarc的文件。打开它,把里面的镜像内容修改为以下内容 channels:- https://mirrors.sjtug.sjtu.edu.cn/anaco…

华硕ROG枪神6plus原装Windows11预装系统 工厂模式恢复安装带ASUSRecevory一键还原安装还原方法

华硕ROG枪神6plus原装Windows11预装系统 工厂模式恢复安装带ASUSRecevory一键还原安装还原方法 第一步:需要拥有文件格式为6个底包的文件 第二步:创建系统u盘 第三步:复制文件到u盘之后,启动华硕工厂模式 第四步:按…

python安装第三方包的两种方式

最近研究QQ空间、微博的(爬虫)模拟登录,发现都涉及RSA算法。于是需要下一个RSA包(第三方包)。折腾了很久,主要是感觉网上很多文章对具体要在哪里操作写得不清楚。这里做个总结,以免自己哪天又忘…

MES管理系统如何为汽配制造赋能

汽配制造是企业产业链的重要环节之一,其生产质量和效率直接影响到汽车的整体质量和安全性。然而,传统的汽配制造管理模式存在着一些问题,如生产过程不透明、信息传递不畅、生产效率低下等,这些问题成为了制约汽配制造发展的瓶颈。…

Qt 之 自定义配置文件类,QSettings应用

目录 一、前言 二、头文件代码 三、源文件代码 四、使用示例 五、使用效果 一、前言 在qt开发过程中,很多时候需要为软件添加配置,让软件在下一次打开时仍然保持上一次关闭时的设置。qt的配置类QSettings,本文通过继承QSettings实现自定…

[深度学习实战]基于PyTorch的深度学习实战(中)[线性回归、numpy矩阵的保存、模型的保存和导入、卷积层、池化层]

目录 一、前言二、线性回归2.1 训练代码2.2 绘图部分代码2.3 numpy 数组的保存和导入代码2.4 完整代码 三、numpy矩阵的保存四、模型的保存和导入4.1 保存模型4.2 导入模型 五、卷积层5.1 Conv2d5.1.1 函数定义5.1.2 参数说明5.1.3 测试代码5.1.4 最终结果 5.2 Conv1d5.2.1 函数…

【cs61b】学习笔记day1

1.1 java基础 Hello World java程序由一个类声明组成,使用关键字public class声明。在Java中,所有代码都位于类中。 运行的代码在一个名为main的方法中,该方法被声明为public static void main(String[] args)。 我们使用大括号{}表示一段…

Vue中TodoList案例_添加

与上一篇Vue中TodoList案例_初始化列表有四个文件变化了 安装nanoid库&#xff1a; npm i nanoid App.vue <template><div id"root"><div class"todo-container"><div class"todo-wrap"><MyHeader :addTodo"…

Guitar Pro 8.1官方中文解锁版功能介绍及下载安装激活教程

Guitar Pro 8.1官方中文解锁版是一款由法国Arobas Music公司开发的吉他学习与MIDI音序制作辅助软件&#xff0c;它具有丰富的功能&#xff0c;包括吉他谱、六线谱、四线谱绘制、打印、查看、试听等方面&#xff0c;能够帮助音乐爱好者更方便地进行音乐学习和创作。Guitar Pro 8…

<Java物联网> 从主动到被动:Java中的BACnet设备属性查询

目录 BACnet 使用软件 资源 模拟器 使用Java主动查 引入maven 创建网络对象 获取远程设备 获取设备属性 使用DeviceEventAdapter订阅 初始化本地BACnet设备和IP网络配置&#xff1a; 启动本地设备和添加监听器&#xff1a; 搜寻远程设备&#xff1a; 发送订阅COV报…

Ansible自动化运维学习——综合练习

目录 (一)练习一 1.新建一个role——app 2.创建文件 3.删除之前安装的httpd服务和apache用户 4.准备tasks任务 (1)创建组group.yml (2)创建用户user.yml (3)安装程序yum.yml (4)修改模板httpd.conf.j2 (5)编写templ.yml (6)编写start.yml (7)编写copyfile.yml (8…

leetcode 46. 全排列

2023.7.23 目前位置回溯系列已经接触过 组合、分割、子集&#xff0c;本题是新类型&#xff1a;排列。排列的最大特点是&#xff1a;各集合有序&#xff0c;所以元素可以重复使用&#xff0c;因此不需要使用start了&#xff1b;需要使用一个used数组记录path中存在哪些元素了&a…

Unity-数据持久化-JSON

一、JsonUtlity JsonUtlity 是 Unity 自带的用于解析 Json 的公共类。它可以 将内存中对象序列化为 Json 格式的字符串 将 Json 字符串反序列化为类对象 1.在文件中存读字符串 using System.IO;// 1.存储字符串到指定路径文件中 // 第一个参数&#xff1a;填写的是 存储的…

四层和七层负载均衡详解

1 概述 四层负载均衡就是工作在计算机网络OSI七层分层的第四层&#xff08;传输层&#xff09;的&#xff0c;七层负载军和则是工作在第七层&#xff08;应用层&#xff09;的。即四层负载均衡是基于IP端口的负载均衡&#xff0c;七层负载均衡是基于URL等应用层信息的负载均衡…

Mysql数据库基本语句

1.数据库操作基本流程 ◼ 连接登陆数据库 ◼ 创建数据库 ◼ 创建数据表 ◼ 插入数据记录 ◼ 断开连接 连接 MySQL 数据库的命令语法格式&#xff1a; mysql [ -h 服务器 IP 或域名 -u 用户名 -p 密码 数据库名称 ]quit 或者 exit 退出数据库 注意事项&#xff1a; 操作指令…

力扣奇遇记 [第一章]

文章目录 &#x1f626;第一题&#xff1a;拿下LeetCode1769. 移动所有球到每个盒子所需的最小操作数学习内容&#xff1a;LeetCode1769. 移动所有球到每个盒子所需的最小操作数&#x1f648;思路分析&#xff1a;&#x1f496;代码产出&#xff1a; &#x1f626;第二题&#…