当前位置: 首页 > news >正文

【Linux】深入理解GCC/G++编译流程及库文件管理

目录

1.背景知识

2.gcc/g++如何完成编译

(1) 预处理(进行宏替换)

(2) 编译(生成汇编)

(3) 汇编(生成机器可识别代码)

(4) 链接(生成可执行文件或库文件)

(5) 总结

(6) 函数库

① 静态函数库

② 动态函数库

③ 动静态库比较

④ 验证动/静态链接

⑤ ldd - 程序的动态函数库解析

(7) gcc选项


1.背景知识

(1) 预处理(宏替换,条件编译)

(2) 编译(生成汇编)

(3) 汇编(生成机器可识别代码)

(4) 链接(生成可执行文件或库文件)

2.gcc/g++如何完成编译

格式 gcc [选项] 要编译的文件 [选项] [目标文件]

(1) 预处理(进行宏替换)

● 预处理功能个主要包括宏定义,文件包含,条件编译,去注释等。

● 预处理指令是以#号开头的代码行

● 【-E】选项的作用是,从现在开始进入程序编译,在预处理的时候就停下来

● 【-o】选项是指定目标文件,【.i】文件为已经预处理过的C原始程序

● 实例:gcc -E test.c -o test.i 将原始C语言代码预处理后的内容写到指定的 test.i 文件里

[zyt@iZ2vcf9wvlgcetfeub9f11Z ~]$ gcc -E test.c -o test.i
[zyt@iZ2vcf9wvlgcetfeub9f11Z ~]$ ll
-rw-rw-rw- 1 zyt zyt   270 Nov 18 09:16 test.c
-rw-rw-r-- 1 zyt zyt 16951 Nov 18 09:16 test.i

● 得到的【.i】文件还是C语言文件

● 预处理后的 【.i 】文件相比原来大很多

那是因为预处理器会将#include指令包含的头文件内容直接插入到源文件中(这些头文件都是被提前装在系统的/usr/include 目录下);预处理器宏定义展开;预处理器还会处理条件编译指令,如#ifdef#ifndef#endif等,这些指令可能会根据条件包含或排除某些代码段。

● 如何理解条件编译?

- 对软件进行专业度,收费情况进行区分(业务),使用条件编译,可以进行代码动态裁剪。

- 内核源代码也是用条件编译进行代码裁剪。

- 开发工具,应用软件也是用条件编译对功能代码动态裁剪。

(2) 编译(生成汇编)

● 在这个阶段中,gcc首先要检查代码的规范性、是否有语法错误等,以确定代码实际要做的工作,在检查无误后,gcc把代码翻译成汇编语言。

● 使用【-S】选项,gcc 会将C语言代码编译成汇编语言,并将结果输出到一个文件中,该文件的扩展名通常是【.s】

● 实例:gcc -S test.i -o test.s

[zyt@iZ2vcf9wvlgcetfeub9f11Z ~]$ gcc -S test.i -o test.s
[zyt@iZ2vcf9wvlgcetfeub9f11Z ~]$ ll
total 28
-rw-rw-rw- 1 zyt zyt   284 Nov 18 09:36 test.c
-rw-rw-r-- 1 zyt zyt 16945 Nov 18 09:37 test.i
-rw-rw-r-- 1 zyt zyt   589 Nov 18 09:39 test.s

我们打开.s文件看看,得到的是汇编文件

(3) 汇编(生成机器可识别代码)

● 汇编阶段是把编译阶段生成的【.s】文件转成目标文件

● 这个目标文件其实就是可重定位目标文件,此时已经是二进制文件了,但是无法直接执行,即使加上可执行权限。那是因为这个.o文件只是把我写的源文件编译成二进制了,而我们写的源文件中会包含很多的库方法,这些库方法还没有跟我们写的内容关联起来,所以是不可能运行的。(形象来说,就是我写的代码里用到了ptintf方法,但.o文件里没有print方法的实现,它的实践是在库里面实现的),win上形成的是XXX.obj。

● 使用【-c】选项就可以看到汇编代码转化为.o后缀的二进制目标代码了

●  实例:gcc -c test.s -o test.o

[zyt@iZ2vcf9wvlgcetfeub9f11Z ~]$ gcc -c test.s -o test.o
[zyt@iZ2vcf9wvlgcetfeub9f11Z ~]$ ll
total 32
-rw-rw-rw- 1 zyt zyt   284 Nov 18 09:36 test.c
-rw-rw-r-- 1 zyt zyt 16945 Nov 18 09:37 test.i
-rw-rw-r-- 1 zyt zyt  1672 Nov 18 09:57 test.o
-rw-rw-r-- 1 zyt zyt   589 Nov 18 09:39 test.s

vim打开【.o】文件后: 

(4) 链接(生成可执行文件或库文件)

● gcc 本身是编译C语言的,会在系统里找出可执行程序依赖的库

● 链接器它将一个或多个.o文件与所需的库文件链接起来,解决所有的外部引用,并生成一个单一的可执行文件。

● 实例: gcc test.o -o test

[zyt@iZ2vcf9wvlgcetfeub9f11Z ~]$ gcc test.o -o test
[zyt@iZ2vcf9wvlgcetfeub9f11Z ~]$ ll
total 44
-rwxrwxr-x 1 zyt zyt  8496 Nov 18 10:13 test
-rw-rw-rw- 1 zyt zyt   284 Nov 18 09:36 test.c
-rw-rw-r-- 1 zyt zyt 16945 Nov 18 09:37 test.i
-rw-rw-r-- 1 zyt zyt  1672 Nov 18 09:57 test.o
-rw-rw-r-- 1 zyt zyt   589 Nov 18 09:39 test.s
# 运行一下
[zyt@iZ2vcf9wvlgcetfeub9f11Z ~]$ ./test
Hello!,100
Hello!
hello N!

(5) 总结

我们上面将gcc完成编译的整个过程通过【-E】【-S】【-c】选项显性的展示成后缀为【.i】【.s】【.o】的临时文件,但是正常编译时,这些后缀文件不会以文件的形式写到磁盘上,而是在gcc编译器启动之后将这些编译形成的临时文件全都写到编译器内部,在内存中就处理好了,最终直接给我们呈现一个可执行文件。

选项记忆技巧:将编译带选项时联想到键盘上的ESC键,即-E-S-c,依次生成的文件可以联想到.iso镜像文件,即.i.s.o

(6) 函数库

● 我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么是在哪里实现的?

● 其实是:系统把这些函数实现都放到名为【libc.so.6】的库文件中了,在没有特别指定时,gcc会到系统默认的搜索路径【/usr/lib】下进行查找,也就是链接到【libc.so.6】库函数中去就能实现函数“printf”了,而这也就是链接的作用。

● 函数库一般分为两大类,分别是静态(static)与动态(dynamic)函数库。

● 什么叫做动静态链接?如何理解?

① 静态函数库

● 扩展名:libxxx.a

● 编译操作

编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大。但在运行时也就不再需要库文件了,也就是编译成功的可执行文件可以独立运行

● 升级难易程度

虽然执行文件可以独立执行,但因为函数库是直接整合到执行文件中的,所以若函数库升级时,整个执行文件必须要重新编译才能将新版的函数库整合到程序中。也就是说,在升级方面只要函数库升级了,所有使用此函数库的程序都要重新编译。

② 动态函数库

● 扩展名:libxxx.so

● 编译操作

与静态函数被整个整合到程序中不同的是,动态函数库在编译时,在程序里面只有一个【指针】的位置而已(地址上产生关联,让我的程序能找到库里面方法的地址)。也就是说,动态函数库的内容并没有被整合到执行文件当中,而是当执行文件要使用到函数库的功能时,程序才会去读取函数库来使用(跳转到库里面执行,完了再返回)。由于执行文件当中仅具有指向动态函数库所在的指针而已,并不包含函数库的内容,所以它的文件会比较小。

● 独立执行状态

这类函数库所编译出的程序不能被独立执行,因为当我们使用到函数库的功能时,程序才会去读取函数,所以函数库文件【必须要存在】才行,而且,函数库的【所在目录也不能改变】,因为我们的可执行文件里面仅有【指针】,亦即当要使用该动态函数库时,程序会主动去某个路径下读取,所以动态函数库可不能随意移动或删除,会影响很多依赖的程序软件。

● 升级难易程度

当函数库升级后,执行文件根本不需要进行重新编译的操作,因为执行文件会直接指向新的函数库文件(前提是函数库新旧版本的文件名相同)。

● gcc默认生成的二进制程序,是动态链接的,这点可以通过file命令验证。

● 动态库的本质:使语言层面的公共代码在内存中只出现一份。

在执行gcc动态链接形成可执行文件时,这个动态库会跟该文件一样被加载到内存里,后续再用gcc编译其他文件时要是也用到这个库,就不用在加载了,直接跳转到内存中的库即可。

③ 动静态库比较

1、动态库形成的可执行程序体积一定很小

2、可执行程序对静态库的依赖度很小,但动态库不能缺失

3、程序运行需要加载到内存,静态链接时,会在内存中出现大量的重复代码,动态链接时,比较节省内存和磁盘资源。

④ 验证动/静态链接

1、验证gcc默认是动态链接

test.c文件里面简单写入:

  1 #include<stdio.h>2 int main()3 {4     printf("Hello!\n");5     return 0;6 }

用gcc完成编译后用 ldd,file 查看该文件详细信息: 得到的 test 是64位、可执行、动态链接的文件 。

链接的动态库就是libc-2.17.so(这是系统里本来就预装的) 

[zyt@iZ2vcf9wvlgcetfeub9f11Z ~]$ ll /usr/lib64/libc.so*
-rw-r--r-- 1 root root 253 Jul  3  2019 /usr/lib64/libc.so
lrwxrwxrwx 1 root root  12 Jul 11  2019 /usr/lib64/libc.so.6 -> libc-2.17.so

 2、如果我们想要用静态库连接

前提:系统里就必须要存在C静态库,但我们指明【-satic】执行后发现系统里没有C静态库。

[zyt@iZ2vcf9wvlgcetfeub9f11Z ~]$ gcc test.c -o test -static
/usr/bin/ld: cannot find -lc
collect2: error: ld returned 1 exit status

安装glic静态库用sudo yum install -y glibc-static 系统会默认把它装到【/usr/lib64/】下,文件名就叫做libc.a。(g++使用也与之类似【sudo yum install libstdc++-static】

[zyt@iZ2vcf9wvlgcetfeub9f11Z ~]$ ll /usr/lib64/libc.a
-rw-r--r-- 1 root root 5105516 Jun  4 23:05 /usr/lib64/libc.a

然后再进行gcc静态编译,发现这个可执行文件会特别的大。比之前动态链接生成的可执行文件大了100倍。用ldd、file观察也显示的是静态链接。

[zyt@iZ2vcf9wvlgcetfeub9f11Z ~]$ gcc test.c -o test -static
[zyt@iZ2vcf9wvlgcetfeub9f11Z ~]$ ll
total 848
-rwxrwxr-x 1 zyt zyt 861336 Nov 18 15:43 test
-rw-rw-rw- 1 zyt zyt     71 Nov 18 15:21 test.c

⑤ ldd - 程序的动态函数库解析

我们如何判断某个可执行的二进制文件含有什么动态函数库?

ldd [-vdr] [filename]

-v:列出所有内容信息

-d:重新将数据有遗失的链接点显示出来

-r:将ELF有关的的错误内容显示出来(某些特定信息,比如ELF头信息、节信息等。这些信息对于调试和分析ELF文件非常有用,尤其是在遇到与ELF文件格式相关的问题时

用ldd查看一下我们刚刚实现的可执行文件test,我们观察到【libc.so.6】就是我们使用的动态链接库,【libc.so.6】是C标准库实现的,是大多数 Linux 程序运行时所依赖的核心库之一。

[zyt@iZ2vcf9wvlgcetfeub9f11Z ~]$ ldd -v testlinux-vdso.so.1 =>  (0x00007ffea694a000)libc.so.6 => /lib64/libc.so.6 (0x00007fefa2f56000)/lib64/ld-linux-x86-64.so.2 (0x00007fefa3323000)Version information:./test:libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6/lib64/libc.so.6:ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2

(7) gcc选项

● -D:进行命令行级别的宏定义

这个选项后面跟着你想要定义的宏名称,如果你还想要为宏指定一个值,如果宏没有值,GCC 会定义它为 1。

test.c文件里面的内容: 

  1 #include<stdio.h>2 #define M 1003 4 int main()5 {6     printf("Hello!%d\n",M);7     //printf("Hello!");8     //printf("Hello!");    9     printf("Hello!\n");10 11     #ifdef N12         printf("hello N!\n");13     #else14         printf("hello no N!\n");15     #endif16         return 0;17 }

我们命令行新定义的一个宏N(不能与源代码中定义的宏相同) 

[zyt@iZ2vcf9wvlgcetfeub9f11Z ~]$ gcc test.c -o test -DN=10
[zyt@iZ2vcf9wvlgcetfeub9f11Z ~]$ ./test
Hello!100
Hello!
hello N!
● -E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面
● -S  编译到汇编语言不进行汇编和链接
● -c  编译到目标代码
● -o 文件输出到 文件
● -static 此选项对生成的文件采用静态链接
● -g 生成调试信息。GNU 调试器可利用该信息。
● -shared 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.
● -O0
● -O1
● -O2
● -O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
● -w  不生成任何警告信息。
● -Wall 生成所有警告信息。

相关文章:

【Linux】深入理解GCC/G++编译流程及库文件管理

目录 1.背景知识 2.gcc/g如何完成编译 (1) 预处理&#xff08;进行宏替换&#xff09; (2) 编译&#xff08;生成汇编&#xff09; (3) 汇编&#xff08;生成机器可识别代码&#xff09; (4) 链接&#xff08;生成可执行文件或库文件&#xff09; (5) 总结 (6) 函数库 …...

【Unity基础】对比Unity中两种粒子系统

在Unity中&#xff0c;Particle System和Visual Effect Graph (VFX) 都是用于创建粒子效果的工具&#xff0c;但它们的设计目标、使用场景和功能特点有所不同。以下是详细对比&#xff1a; 1. Particle System 特点 传统粒子系统&#xff0c;Unity自带的模块化粒子特效工具。…...

琐碎笔记——pytest实现前置、后置、参数化、跳过用例执行以及重试

pytest的fixture中文介绍可参考&#xff08;不过文档稍微有点老&#xff09;&#xff1a; https://www.osgeo.cn/pytest/fixture.html#what-fixtures-are pytest各个作用域的fixture scope “function” 可作用于每个用例 fixture使用的声明放在类定义前面&#xff0c;类中的…...

C# 深层副本与浅层副本 深拷贝与浅拷贝

C# 深层副本与浅层副本 数据复制是编程中的重要任务。 对象是 OOP 中的复合数据类型。 对象中的成员字段可以按值或按引用存储。 可以以两种方式执行复制。 浅表副本将所有值和引用复制到新实例中。 引用所指向的数据不会被复制&#xff1b; 仅指针被复制。 新的引用指向原始…...

CH06_Lambda表达式

第6章&#xff1a;Lambda表达式 本章目标 为什么要学习C#编程语言 了解C#相关常识 C#开发工具Visual Studio安装 掌握C#程序的开发步骤 掌握C#的注释 掌握C#的常用转义符 本章内容 lambda表达式演变史 C# 匿名函数的演变历史可以追溯到 C# 语言的不同版本&#xff0c;…...

大模型本地部署实践:Ollama+Open-WebUI(MacOS)

目录 什么是Ollama Ollama安装 对话界面可视化&#xff1f;Open-WebUI&#xff01; 安装Open-WebUI 什么是Ollama Ollama是一个为简化大语言模型本地部署与交互的开源框架。它提供了用户友好的接口&#xff0c;帮助开发者和模型爱好者在没有依赖外部API的基础上高效地运行、…...

JavaScript——DOM编程、JS的对象和JSON

一、DOM编程 DOM(Document Object Model)编程&#xff1a;就是使用document对象的API&#xff0c;完成对网页HTML文档进行动态修改&#xff0c;以实现网页数据&#xff0c;和样式动态变化效果的编程。 (一)DOM获取元素的多种方法 1.查找元素的函数 getElementById("id值…...

SIMCom芯讯通A7680C在线升级:FTP升级成功;http升级腾讯云对象储存的文件失败;http升级私有服务器的文件成功

从事嵌入式单片机的工作算是符合我个人兴趣爱好的,当面对一个新的芯片我即想把芯片尽快搞懂完成项目赚钱,也想着能够把自己遇到的坑和注意事项记录下来,即方便自己后面查阅也可以分享给大家,这是一种冲动,但是这个或许并不是原厂希望的,尽管这样有可能会牺牲一些时间也有哪天原…...

OSRM docker环境启动

命令一把梭 wget https://download.geofabrik.de/asia/china-latest.osm.pbf docker pull osrm/osrm-backend docker run -t -v "${PWD}:/data" osrm/osrm-backend osrm-extract -p /opt/car.lua /data/china-latest.osm.pbf docker run -t -v "${PWD}:/data&q…...

Vue3 动态获取 assets 文件夹图片

我真服了Vue3 这个老六了,一个简单图片src 赋值搞得那么复杂. //item.type 是我遍历类型的类型参数 <img alt"吐槽大会" :src"getAssetUrl(item.type)" /> 基于 Vue2 的Webpack 处理,还不错,可以用/ 这种绝对路径,可以接受,虽然多了个require很不爽…...

<项目代码>YOLOv8 草莓成熟识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…...

代码随想录算法训练营第五十一天|Day51 图论

岛屿数量 深搜 https://www.programmercarl.com/kamacoder/0099.%E5%B2%9B%E5%B1%BF%E7%9A%84%E6%95%B0%E9%87%8F%E6%B7%B1%E6%90%9C.html 思路 #include <stdio.h> #define MAX_SIZE 50 int grid[MAX_SIZE][MAX_SIZE]; int visited[MAX_SIZE][MAX_SIZE]; int N, M; …...

uniapp 自定义加载组件,全屏加载,局部加载 (微信小程序)

效果图 全屏加载 页面加载使用 局部加载 列表加载里面使用 使用gif html <template><view><view class"" v-if"typeFullScreen"><view class"loading" v-if"show"><view class""><i…...

STM32完全学习——系统时钟设置

一、时钟框图的解读 首先我们知道STM32在上电初始化之后使用的是内部的HSI未经过分频直接通过SW供给给系统时钟&#xff0c;由于内部HSI存在较大的误差&#xff0c;因此我们在系统完成上电初始化&#xff0c;之后需要将STM32的时钟切换到外部HSE作为系统时钟&#xff0c;那么我…...

Github 2024-11-16Rust开源项目日报 Top10

根据Github Trendings的统计,今日(2024-11-16统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10Go项目1Python项目1Lapce:用 Rust 编写的极快且强大的代码编辑器 创建周期:2181 天开发语言:Rust协议类型:Apache License 2.0St…...

CH03_反射

第3章&#xff1a;反射 本章目标 掌握反射的原理 熟悉反射的基本运用 本章内容 反射是什么 C# 编译运行过程 首先我们在VS点击编译的时候&#xff0c;就会将C#源代码编译成程序集 程序集以可执行文件 (.exe) 或动态链接库文件 (.dll) 的形式实现 程序集中包含有Microsoft …...

vue2侧边导航栏路由

<template><div><!-- :default-active"$route.path" 和index对应其路径 --><el-menu:default-active"active"class"el-menu-vertical-demo"background-color"#545c64"text-color"#fff"active-text-col…...

core 不可变类型 线程安全 record

当一个类型的对象在创建时被指定状态后&#xff0c;就不会再变化的对象&#xff0c;我们称之为不可变类型。这种类型是线程安全的&#xff0c;不需要进行线程同步&#xff0c;非常适合并行计算的数据共享。它减少了更新对象会引起各种bug的风险&#xff0c;更为安全。 System.D…...

linux之调度管理(8)-SMP cpu 的 psci启动

一、psci介绍 psci是arm提供的一套电源管理接口&#xff0c;当前一共包含0.1、0.2和1.0三个版本。它可被用于以下场景&#xff1a; &#xff08;1&#xff09;cpu的idle管理 &#xff08;2&#xff09;cpu hotplug以及secondary cpu启动 &#xff08;3&#xff09;系统shutdo…...

review-消息中间件MQ

RabbitMQ RabbitMQ&#xff0c;作为当今流行的开源消息代理软件&#xff0c;以其卓越的可靠性、灵活性和易用性在微服务架构和分布式系统中扮演着至关重要的角色。它不仅能够确保消息在不同系统组件间的高效传递&#xff0c;还能通过其高级消息队列协议&#xff08;AMQP&#x…...

leetcode400第N位数字

代码 class Solution {public int findNthDigit(int n) {int base 1;//位数int weight 9;//权重while(n>(long)base*weight){//300n-base*weight;base;weight*10;}//n111 base3 weight900;n--;int res (int)Math.pow(10,base-1)n/base;int index n%base;return String…...

前端网页开发学习(HTML+CSS+JS)有这一篇就够!

目录 HTML教程 ▐ 概述 ▐ 基础语法 ▐ 文本标签 ▐ 列表标签 ▐ 表格标签 ▐ 表单标签 CSS教程 ▐ 概述 ▐ 基础语法 ▐ 选择器 ▐ 修饰文本 ▐ 修饰背景 ▐ 透明度 ▐ 伪类 ▐ 盒子模型 ▐ 浮动 ▐ 定位 JavaScript教程 ▐ 概述 ▐ 基础语法 ▐ 函数 …...

CSS遮罩:mask

CSS属性 mask 允许使用者通过遮罩或者裁切特定区域的图片的方式来隐藏一个元素的部分或者全部可见区域。 // 一般用位图图片做遮罩 mask: url(~/assets/images/mask.png); mask-size: 100% 100%;// 使用 SVG 图形中的形状来做遮罩 mask: url(~/assets/images/mask.svg#star);…...

Swift闭包的本质

1 闭包的本质其实是一个引用类型&#xff1a;存储在堆空间上&#xff0c;由堆分配空间&#xff0c;且生命周期由ARC&#xff08;自动引用计数机制&#xff09;管理 2 捕获值&#xff1a;闭包会捕获上下文使用到的变量&#xff08;引用类型会保持引用关系&#xff09;&#xff…...

时代变迁对传统机器人等方向课程的巨大撕裂

2020年之后&#xff0c;全面转型新质课程规划&#xff0c;传统课程规划全部转为经验。 农耕-代表性生产关系-封建分配制度主要生产力-人力工业-代表性生产关系-资本分配制度工业分为机械时代&#xff0c;电气时代&#xff0c;信息时代&#xff1b;主要生产力-人力转为人脑&…...

【算法设计与分析实训】第1关:求序列的最大字段和

务描述 本关任务&#xff1a;编写用动态规划解决最大字段和问题。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;动态规划。 编程要求 给定由n个整数&#xff08;可能为负数&#xff09;组成的序列&#xff1a;a1,a2,……,an, 求该序列的最大子段和。当所有整…...

【澜舟科技-注册/登录安全分析报告】

前言 由于网站注册入口容易被机器执行自动化程序攻击&#xff0c;存在如下风险&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露&#xff0c;不符合国家等级保护的要求。短信盗刷带来的拒绝服务风险 &#xff0c;造成用户无法登陆、注册&#xff0c;大量收到垃圾短信的…...

【读书笔记-《网络是怎样连接的》- 7】Chapter3_2 路由器

本篇继续介绍路由器及其转发过程。 1 路由器内部结构 路由器内部结构图如图所示。 即主要包含左侧的包转发模块和右侧的端口模块。转发模块负责查找包的发送目的地&#xff0c;端口模块完成包的发送。通过安装不同的硬件&#xff0c;转发模块不仅可以支持以太网&#xff0c;也…...

Android Activity 基础接口知识和常见问题

Activity 知识点及问题点 接口onMultiWindowModeChangedonConfigurationChanged 常见问题Android解决点击桌面图标&#xff0c;就重新启动应用程序问题 接口 onMultiWindowModeChanged 定义 onMultiWindowModeChanged是Android中Activity类的一个回调方法。它会在活动&#xf…...

利用python 检测当前目录下的所有PDF 并转化为png 格式

以下是一个完整的 Python 脚本&#xff0c;用于检测当前目录下的所有 PDF 文件并将每一页转换为 PNG 格式&#xff1a; import os from pdf2image import convert_from_path# 设置输出图像的 DPI&#xff08;分辨率&#xff09; DPI 300# 获取当前目录 current_directory os…...

教做网站视频/东莞网络优化哪家公司好

这道题是一题解密题&#xff0c;题目给出了密文和加密程序&#xff0c;然后看着他写出解密脚本就行了加密程序大概是这样public function encode($str){$res "";$_o strrev($str);for ($i 0; $i < strlen($str); $i){$c substr($_o,$i,1);$j ord($c)1;$c ch…...

自做网站告白如何弄/网络广告营销的概念

一、thrift返回结果封装 Thrift文件添加版本号&#xff0c;方便对thrift的版本进行控制 服务与返回的数据类型分开定义 在项目中使用Thrift提供RPC服务时&#xff0c;很多情况下我们都会将返…...

宁夏交通厅建设局网站/贵州seo技术查询

你是否喜欢一些小众且无广告的软件&#xff1f;如果是的话&#xff0c;我这边有一些给你推荐的。 1.取色工具——ColorPix ​ ColorPix是一款简单的取色工具&#xff0c;可以随时捕捉屏幕上的颜色&#xff0c;并显示其RGB值和十六进制代码。ColorPix还支持放大镜和颜色锁定功…...

雄安微网站开发/企业推广策略

一. kali安装ssh服务 1.修改源 1 rootDGG:~# vi /etc/apt/sources.list2 deb http://http.kali.org/kali kali-rolling main non-free contrib 2.更新一下源 apt-get update 3.下载ssh服务包 apt-get install ssh 4.打开ssh服务 1 service ssh start 打开ssh服务 2 service …...

可以用服务器做网站/国内新闻摘抄

作为一名SEO人员&#xff0c;我们每天都会遇到各种千奇百怪的事情&#xff0c;但这些新问题&#xff0c;往往都是因为自己的小疏忽所造成的&#xff0c;比如&#xff1a;我们偶尔在利用site命令查询网站收录情况的时候&#xff0c;偶尔会遇到一个情况&#xff1a;网页展现的内容…...

九江网站建设优化公司/武汉seo优化顾问

ubuntu12.04 Grub启动项 1、异常开关机导致需要键盘选择启动项&#xff0c;如下图&#xff1a;此时需要用键盘&#xff0c;按下”Enter“键进入系统&#xff0c;如此操作很是烦人啊。。2、彻底解决这个问题的方法&#xff1a;(A)于是有效的方法是修改/etc/grub.d/00_head文件中…...