Linux第七节课gcc与g++

一、补充权限

普通用户无法执行sudo:

通过sudo执行后显示不在sudoers file中!(张三不被信任!)

需要修改配置文件(白名单!)

配置文件位于以下目录:

ls /etc/sudoers -l

只有root才能访问这个文件!

通过root账号打开 sudoers文件:

在第100行下面加上对应自己用户名的权限,添加完后保存退出,即使得对应的用户在白名单中。

二、gcc / g++ 编译使用

gcc / g++ 默认生成的可执行程序的名称为a.out

  • gcc只能编译c语言;
  • g++可以编译c / cpp,编译c也是按照c++的格式编译,但是建议编译c++;

1、编译步骤详解

编译生成可执行程序的步骤:

预处理:

  • 预处理(进行宏替换)

其中包括四部分:去注释;头文件展开;条件编译;宏替换

gcc -E mycode.c -o mycode.i

-E : 告诉gcc,从现在开始进行的程序的翻译,将预处理工作昨晚停下来,不要继续往前!

将c文件预处理,生成预处理后的代码(预处理后就不需要头文件!)

条件编译:根据我们写的宏来灵活的进行选择性的编译。

示例:(如果定义的GEBUG这个宏)

#ifedf DEBUGprintf("hello debug\n");
#elseprintf("hello release\n");
#endif

除此之外,我们还可以通过不修改代码进行添加宏!

gcc - E mycode.c -o mycode.i -DDEBUG

-DDEBUG 是一个预处理器定义。这意味着在预处理阶段,会定义一个名为 DEBUG 的宏。例如,如果在代码中有 #ifdef DEBUG 这样的条件编译指令,当定义了 DEBUG 这个宏时,相应的代码段就会被包含进来进行处理。 

 条件编译的应用场景:有的软件分为社区版和专业版,社区版的软件是由免费版的裁切过来的。 

预处理之后的代码还为C语言!

编译:

  • 编译(生成汇编)
gcc - S mycode.i -o mycode.s

-S :  开始进行程序的翻译,将编译工作做完就停下来!(可以从.c文件到.s)

汇编:

  • 汇编(生成机器可识别代码 --- 生成二进制代码)
gcc - c mycode.s -o mycode.o

-c :  开始进行程序的翻译,将汇编工作做完就停下来!(可以从.c文件到.s) 

生成的.o文件叫做可重定位目标二进制文件,简称目标文件;在·Windows下被称为.obj文件!

该文件不可以独立执行,虽然已经为二进制文件,但是还需要链接!

可以使用二进制查看工具查看二进制代码

od test.o

链接: 

  • 链接(生成可执行文件 / 库文件)
gcc test.o -o test

2、库 

在我们写c文件的时候,直接调用头文件可以进行库函数的使用,但是头文件中只包含了函数的声明,没有函数的定义!那么函数的声定义位于哪?

函数、方法的实现就在库当中! 

库本质其实就是源文件(.c)经过一定的翻译,然后打包 -- 只给自己提供一个文件即可,不用提供太多的库文件;也可以达到隐藏源文件的目的

gtp4o - mini解释如下:

当你在程序中包含一个头文件,比如 #include <stdio.h>,你会获得库函数,如 printf 的声明。头文件中仅包含函数的原型(即函数的声明),这使得编译器知道如何处理函数调用,并进行类型检查等。

而实际的实现代码则存在于编译器提供的库文件中。例如,在大多数操作系统中,C语言的标准库会被打包成一些动态链接库(如 libc.so 在Linux中,或 msvcrt.dll 在Windows中)或静态库(如 libc.a)。这些库文件包含了所有标准库函数的实际实现。

结论:

头文件提供方法的声明,库文件提供方法的实现 + 自己的代码 = 可执行程序!

库文件的作用就是我们不用自己进行重复的工作(例如不需要自己实现printf函数)

默认链接的时候,连接的是C的标准库!

当运行到哪一步需要调用函数的时候(链接器告诉去对应的哪里链接对应的库)

在Linux系统中,标准库位于

ls /usr/lib64/libc.so

本质上是一个文件! 

  • 在Linux系统中,   .so(动态库)  .a(静态库)
  • 在windows系统中  .dll(动态库) .lib(静态库)

库有自己的命名规则:libname.so.xxx(例如libc.so就是c的标准动态库)

云服务器默认安装的只有动态库,没有安装静态库!

 将可重定位目标二进制文件和库进行链接生成可执行程序!

  • 键盘左上角ESC对应于我们生成的指令!
  • iso为每阶段生成的代码 --- 对应于镜像文件!

 将可重定位目标二进制文件(经汇编生成的二进制文件)和库进行链接生成可执行程序!

为什么能在给Windows / Linxu上进行 C / C++或者其他形式的开发?

因为我们系统中安装的有C / C++开发相关的头文件 / 库文件!

C / C++开发环境不仅仅指的是vs,gcc,g++,更重要的是,语言本身的头文件和库文件!

在Linux系统中,头文件位于一下路径:

ls /usr/include/

因此,安装vs2019, vs2022等,在安装的时候,要选择对应的开发包,同步也在下载c的头文件和库文件;

即C的头文件和库文件,也在WIndows下存在!如下所示:

编译型语言:安装开发包,必定是下载对应的头文件 + 库文件。

注意点:

  • gcc 默认不加选项则直接生成可执行程序。
  • 生成的可执行程序不区分后缀名!例如
    gcc test.c -o test.txt

    文件依旧能正常运行!

  • 推荐生成的可执行程序不加后缀名

    gcc -o test test.c

    -o后面直接加可执行程序名,源代码的位置没有要求!

  • 生成的程序不带 -o则默认打印到显示器上;带-o回输入到我们指定的文件中!

  • 生成可执行程序的选项中后面跟上的是对应的源代码!

在链接的时候需注意:

  • gcc默认链接c的库;
  • g++默认链接c++的库

我们的.o和库如何链接?

3、动态链接与静态链接

  • 动态链接

动态库不能缺失,一旦对应的动态库缺失,影响的不止是一个程序,可能导致很多程序无法正常运行!

通过ldd指令可以查看一个程序所依赖的动态库(若是静态链接不显示),例如

ldd mytest

 Linux系统中好多指令也是用C/C++写的!

ldd /usr/bin/pwd
  • 静态链接

在编译器使用静态库进行静态链接的时候,会将自己的方法拷贝到目标程序中,该程序以后不用再依赖静态库!

结论:

  • 在Linux中,编译形成的可执行程序,默认采用的就是动态链接 -- 提供动态库!
  • 在Linux中,如果要按照静态链接的方式,进行形成可执行程序,需要添加-static选项--提供静态库。

例如:

gcc mycode.c -o mycode-static -static
  • 使用静态库生成的可执行程序比使用动态库的体积大!

没有静态库的时候可以自行安装C的静态库,例如在centos7中:

sudo yum install -y glibc-static

如果需要安装C++对应的静态库,可以使用以下:

sudo yum install -y libstdc++ static

结论:

  • 如果我们没有静态库,但是我们就要使用static,行不行呢?   --- 不行!
  • 如果我们没有动态库,只有静态库,而且gcc能找到,gcc依旧能编译,因为gcc默认优先动态链接! -static的本质是:改变优先级!
  • 生成的可执行程序不一定纯为动态链接 / 静态链接,可能是混合的!(但是static修饰的一定纯为静态链接!)

file指令

可以查看文件的信息(例如文件的链接库)

file mytest

总结:动态库与静态库的优缺点

  • 动态库因为是共享库,可以有效地节省资源(磁盘空间、内存空间、网络空间等)【动态优点】
  • 动态库一旦缺失,导致各个程序无法运行;【缺点】
  • 静态库不依赖库可以独立运行;【优点】
  • 静态库体积大,比较消耗资源【缺点】

4、release与dubug

通过默认的gcc生成的可执行程序是release版本!

debug:可以被追踪调试,形成可执行程序,添加了debug信息(体积一般比release大)

可以通过指定选项来使用debug调试:(加上-g选项)

gcc mycode.c -o mytest-static_debug -sattic -g

可以通过readelf读取可执行程序的代码:

readelf -S mytest_debug

拓展:可执行程序形成的时候,不是无序的二进制构成,而是有自己的格式 -- 可执行程序有自己的二进制格式 -- ELF格式(Linux系统中)

  • g++的选项与gcc一致!
  • make是一条指令!
  • makefile是一个文件!

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

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

相关文章

如何在 Odoo 16 网站中创建高级选择字段

Odoo 在后端用户界面中包含各种小部件&#xff0c;用于执行各种活动&#xff0c;例如 one2many、many2many、many2many_tags 等&#xff0c;这简化并简化了 Odoo 中选择字段的操作。因此&#xff0c;当我们创建包含 one2many 或 many2many 字段的表单时&#xff0c;很难在没有外…

如何在linux中安装搜狗输入法

参考网址&#xff1a;搜狗输入法linux-安装指导 sudo apt-get install fcitx 1.更新源&#xff1a;在终端输入 sudo apt update 2.安装fcitx输入法框架&#xff1a; sudo apt install fcitx 3.设置fcitx开机自启动 sudo cp /usr/share/applications/fcitx.desktop /etc/xdg/aut…

航空航天混合动力(1)全权限数字发动机控制器(FADEC)

航空航天混合动力&#xff08;1&#xff09;全权限数字发动机控制器&#xff08;FADEC&#xff09; 1.概况2.什么是全权限数字发动机控制器&#xff08;FADEC&#xff09;&#xff1f;2.1核心技术2.2应用场景2.3国内FADEC供应商2.4近期进展2.5数字发动机控制和全权数字发动机控…

开放式耳机什么牌子的好?看这6大品牌就够了

移动互联网时代&#xff0c;听歌、追剧、网课、短视频……这几年全球青年人对于耳机和耳朵的依赖程度&#xff0c;可谓前所未有的提升。但选择一款好的耳机&#xff0c;也不是一件容易的事&#xff0c;入耳式耳机戴久了耳道会疼&#xff0c;还可能引起一系列不必要的炎症&#…

彻底搞清楚SSR同构渲染的首屏

作为.NET技术栈的全干工程师&#xff0c;Blazor、Vue/Nuxt.js和React/Next.js都会接触到。它们&#xff08;准确的说是Blazor、Nuxt和Next&#xff09;&#xff0c;都实现了SSR同构渲染。要了解同构渲染&#xff0c;需要从服务端渲染开始。 传统的服务端渲染 如下图所示&…

孟德尔随机化、R语言,报错,如何解决?

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

喜讯|华院计算Uni-law法律大模型成功入选《2024中国数据智能产业AI大模型先锋企业》

7月24日&#xff0c;“2024企业数智化转型升级发展论坛——暨AI大模型趋势论坛”在北京圆满落幕。此次论坛由数据猿主办&#xff0c;IDC协办&#xff0c;新华社中国经济信息社、上海大数据联盟、上海市数商协会及上海超级计算中心作为支持单位。大会以“数智新质力拓未来”为主…

世界上速度最快的超级计算机推导出超级BC8钻石配方

BC8 超级钻石比任何已知材料都要坚硬&#xff0c;但它们很可能只存在于巨型系外行星的内核中。现在&#xff0c;世界上最强的超级计算机"前沿"已经揭开了它们形成的秘密&#xff0c;这一发现可能会导致在地球上生产它们。 钻石不仅是夺人眼球的珠宝&#xff0c;而且在…

【日记】9 个发箍只有 2 个能压住头发……(513 字)

正文 今天下午实在有些受不了&#xff0c;从正大门外走了出去。抬头望着天空&#xff0c;望着那些悠然自在纯白无暇的云&#xff0c;竟然有些眼睛疼&#xff0c;刺激到想要流泪。 我在室内待得太久太久了。似乎很久没有在这种时间段出来过了。 下午快下班的时候&#xff0c;有个…

使用docker在CentOS 7上安装php+mysql+nginx环境教程并运行WordPress

文章目录 一、安装docker1、切换yum源并更新系统2、卸载旧版docker3、配置Docker的yum库4、安装Docker5、启动和校验Docker6、配置镜像加速6.1、注册阿里云账号6.2、开通镜像服务6.3、配置镜像加速二、部署php+mysql+nginx环境1、准备目录结构2、拉取镜像3、运行容器并从中拷贝…

LLaMA-Factory私有化部署--云服务器版

LLaMA-Factory是一款比较流行的大语言模型微调框架。本文主要记录在阿里云人工智能平台PAI的DSW实例中部署LLaMA-Factory的过程&#xff0c;主要参考的教程是B站视频LLaMA-Factory私有化部署。 LLaMA-Factory的私有化部署与部署大模型的过程大体相同&#xff0c;都包括创建Pyt…

AI画笔,你的创意伙伴:6款最佳AI绘画工具推荐

在这个无限可能的时代&#xff0c;一个优秀的人工智能绘画软件不仅可以打破传统绘画方法的束缚&#xff0c;而且可以让每个热爱艺术的人都体验到创作的乐趣。那么&#xff0c;什么样的人工智能绘画软件才是优秀的呢&#xff1f;什么样的人工智能绘画软件才能生成超逼真的AI绘画…

Java面试八股之Spring如何解决循环依赖

Spring如何解决循环依赖 在Spring框架中&#xff0c;循环依赖问题通常发生在两个或多个Bean相互依赖的情况下。Spring为了解决循环依赖问题&#xff0c;采用了不同的策略&#xff0c;这些策略主要取决于Bean的作用域以及依赖注入的方式。下面是一些关键点&#xff1a; 单例Be…

项目实战_表白墙(简易版)

你能学到什么 一个比较简单的项目&#xff1a;表白墙&#xff08;简易版&#xff09;&#xff0c;浏览器&#xff1a;谷歌升级版将在下个博客发布 效果如下 正文 说明 我们是从0开始一步一步做这个项目的&#xff0c;里面的各种问题&#xff0c;我也会以第一人称视角来解…

android13 第三方桌面不能使用后台历史任务问题 任务键功能失效问题

总纲 android13 rom 开发总纲说明 目录 1.前言 2.复现现象 3.问题分析 4.解决方法 5.编译运行 6.彩蛋 1.前言 随着Android 13操作系统的发布,用户现在可以更加自由地选择和使用第三方Launcher来定制自己的设备。本文将介绍在Android 13上安装和使用第三方Launcher导致…

KubeSphere部署:(三)MySQL安装

MySQL没有什么特殊的&#xff0c;这里记录一下部署过程(本文示例中安装的版本为5.7.29)。步骤大致如下&#xff1a; 拉取docker镜像 -> 标记并推送至私有harbor -> 创建有状态负载 -> 创建服务 一、拉取镜像&#xff0c;并推送至私有harbor # 拉取镜像 docker pull …

ant-design-vue 中 table行 点击事件

在使用 AntDesign 过程中&#xff0c;需求单击表格选中。设置table的customRow属性 设置之后&#xff0c;虽说官方文档也有详细介绍如何实现该功能。但是没看太懂&#xff0c;百度后解决 <a-table:columnscolumns:data-sourcetableDatachangehandleTableChange:customRowrow…

MySQL的跳跃式索引

Skip Index Scan&#xff08;跳跃式索引&#xff09; 例如初中有个学生表&#xff0c;年级、班级、学号 符合索引。 -- 问题是下面这个查询为什么也可以用到索引。 select * from 初中学生表 where 班级 1 and 学号 001-- 思考一下这个查询比全表扫描快吗&#xff1f; sele…

Springcloud物流配送后台-计算机毕业设计源码69809

目 录 摘要 1 绪论 1.1 选题背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2 物流配送后台系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 操作可行性分析 2.2 系统流程分析 2.2.1数据增加流程 2.2.2 数据修改流程 2.2.3 数据…