Linux第七节课gcc与g++

news2024/9/17 8:59:38

一、补充权限

普通用户无法执行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 DEBUG
    printf("hello debug\n");
#else
    printf("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://www.coloradmin.cn/o/1962484.html

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

相关文章

[Day 40] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

強化學習概述 強化學習&#xff08;Reinforcement Learning, RL&#xff09;是一種機器學習方法&#xff0c;主要用於訓練智能體&#xff08;agent&#xff09;在特定環境&#xff08;environment&#xff09;中進行決策。智能體通過嘗試和錯誤來學習&#xff0c;以最大化其累…

【iOS】—— iOS持久化

iOS持久化 1. 数据持久化的目的2. iOS持久化的方案3. 数据持久化方式的分类内存缓存磁盘缓存 4. 沙盒机制5. 沙盒的目录结构获取应用程序的沙盒路径每次编译代码会生成新的沙盒路径&#xff0c;每次运行获得的沙盒路径都不一样。访问沙盒目录常用C函数介绍沙盒目录介绍 6. 持久…

浅谈线程组插件之bzm - Arrivals Thread Group

浅谈线程组插件之bzm - Arrivals Thread Group bzm - Arrivals Thread Group 是 JMeter 中的一个高级插件&#xff0c;由 BlazeMeter 提供&#xff0c;旨在为性能测试提供更灵活、更贴近实际场景的负载生成方式。与传统的线程组不同&#xff0c;Arrivals Thread Group 通过控制…

网上订餐系统2024((代码+论文+ppt)

网上订餐系统2024((代码论文ppt),编号:sp006 代码经过修正,确保可以运行,下载地址在文末 技术栈: springbottvuemysql 展示: 下载地址: CSDN现在上传有问题,有兴趣的朋友先收藏.正常了贴上下载地址 备注: 专业承接各种程序java,c,c,python,cuda,AI 运行有问题请私信我,…

互联网医院系统源码与医保购药APP开发的完整技术指南

本篇文章&#xff0c;笔者将详细介绍互联网医院系统与医保购药APP的开发全过程&#xff0c;帮助开发者理解其技术要点和实现路径。 一、互联网医院系统开发 1.需求分析与系统设计 需要明确系统的功能需求&#xff0c;如在线问诊、预约挂号、电子病历管理、远程医疗、支付系统…

木材缺陷数据集:从手工模式到智能时代的跨越

亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 引言 …

【运维指南】常见的防火墙端口操作

每当一个应用程序想通过网络访问自己时&#xff0c;它就会申请一个 TCP/IP 端口&#xff0c;这意味着该端口不能被其他任何程序使用。那么&#xff0c;如何检查开放的端口&#xff0c;看看哪个应用程序已经在使用它呢&#xff1f; Windows 查看端口使用情况和进程名称 netst…

详解Qt 之QMdiArea 和 QMdiSubWindow

文章目录 前言QMdiArea概念作用为什么需要 QMdiAreaQMdiArea 的主要函数和成员函数列表 QMdiSubWindow概念作用为什么需要 QMdiSubWindowQMdiSubWindow 的主要函数和成员函数列表 示例代码 更多用法... 总结 前言 在复杂的应用程序中&#xff0c;尤其是那些需要同时管理多个子…

Linux AMBA 驱动:DMA 控制器 PL330 驱动简析

文章目录 1. 前言2. 背景3. PL330 简介4. PL330 驱动加载流程4.1 PL330 设备注册流程4.2 PL330 驱动加载流程 5. 小结6. 参考资料 1. 前言 限于作者能力水平&#xff0c;本文可能存在谬误&#xff0c;因此而给读者带来的损失&#xff0c;作者不做任何承诺。 2. 背景 本文基于…

什么牌子的骨传导耳机好?这五款骨传导耳机用过都是好评!

骨传导耳机&#xff0c;作为听音设备的创新之作&#xff0c;以其独特的传音方式赢得了市场的广泛认可。它不仅让日常听音更加健康舒适&#xff0c;还完美契合了运动场景的需求&#xff0c;让用户在享受音乐的同时&#xff0c;保持对周围环境的敏锐感知。这种设计上的巧思&#…

【QT串口助手】

首先非常感谢CSDN吾爱技术圈分享的QT初体验&#xff1a;手把手带你写一个自己的串口助手&#xff0c;本教程重点参考 1. 前言 由于qt应用项目需求&#xff0c;前期也安装过QT&#xff08;参考博客&#xff1a;【Qt安装与简易串口控制Arduino开发板小灯教程】&#xff09;&…

守护线程(Daemon Threads)详解:与非守护线程的区别

守护线程&#xff08;Daemon Threads&#xff09;详解&#xff1a;与非守护线程的区别 1、守护线程是什么&#xff1f;2、守护线程与非守护线程的区别2.1 JVM关闭行为2.2 任务性质2.3 线程设置2.4 示例代码 3、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收…

人工智能学习笔记 - 初级篇Ⅱ - 图形可视化 - 第11节: 绘制带填充区域的图表

微信公众号&#xff1a;御风研墨 关注可了解更多。问题或建议&#xff0c;请公众号留言 文章目录 绘制带填充区域的图表应用背景准备工作操作步骤工作原理补充说明最后 绘制带填充区域的图表 应用背景 在数据可视化中&#xff0c;带填充区域的图表可以有效地表示数据范围、趋…

创客项目秀 | 基于 XIAO 开发板的语音向导

背景 柴火创客空间作为大湾区科技创新的窗口&#xff0c;每年到访空间的社区伙伴众多&#xff0c;为了更好的进行空间信息交互&#xff0c;我们希望有一个装置是可以解决&#xff1a;当空间管理员不在现场的时候&#xff0c;到访者可以通过装置获得清晰的介绍与引导。 为了解…

APP逆向 day24unidbg上

一.前言 今天开始讲app逆向最后一个也是最重要的unidbg&#xff0c;这已经是从初级进阶到中级的了&#xff0c;我会讲unidbg&#xff0c;讲三节课&#xff0c;分为上中下来和大家讲&#xff08;由简单到难逐步&#xff09;&#xff0c;这节课主要是和大家讲unidbg的介绍并且会…

详解工厂模式与抽象工厂模式有什么区别?【图解+代码】

目录 工厂模式&#xff0c;抽象工厂模式是什么&#xff1f; 两种设计模式的流程&#xff1a; 1、工厂模式 2、抽象工厂模式 两种模式的对比 共同点&#xff1a; 不同点&#xff1a; 总结 工厂模式&#xff0c;抽象工厂模式是什么&#xff1f; 我已经具体的写了这两种模…

我的「Java全栈高级架构师高薪就业课」适合什么样的人群学习?

我的《Java全栈高级架构师高薪就业课》上线了~ 这是一套Java全栈微服务架构、以实战项目驱动的课程&#xff01;包含34个模块&#xff0c;1514课时。对标阿里P7级别技术栈而研发&#xff0c;有着循序渐进的学习体系&#xff0c;助你开启Java进阶之旅。 我的这套《Java全栈高级…

海域感知与岸线监控实施方案:总体技术架构

文章目录 引言I 总体架构1.1 物理结构图1.2 功能逻辑结构图1.3 系统架构1.4 雷达光电船只检测系统拓扑图1.5 雷达光电船只联动跟踪效果图II 技术架构存储Geoserver视频see also引言 利用渔船现有的定位导航通讯设备等资源,实现岸线和近岸海域内违法船舶和可疑船舶预警、抓拍、…

系统学习渗透测试:从零到精通的全面指南

渗透测试&#xff0c;作为网络安全领域的一项重要技术&#xff0c;旨在通过模拟黑客攻击来评估计算机系统的安全性。对于想要系统学习渗透测试的人来说&#xff0c;这既是一条充满挑战的道路&#xff0c;也是一次深入了解网络安全的宝贵机会。本文将从基础知识、技能提升、实战…

怎麼使用ixbrowser指紋流覽器?

ixBrowser是一款指紋流覽器流覽器&#xff0c;利用指紋隔離技術確保在與Pixelscan等第三方檢測網站進行測試時具有出色的通過率&#xff0c;能夠輕鬆管理多個獨立帳戶。此外&#xff0c;ixBrowser能夠創建無限的獨立個人資料並邀請團隊成員。簡化了運營&#xff0c;降低了運營成…