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

上线倒计时单页网站模板温州网站推广

上线倒计时单页网站模板,温州网站推广,怎么查询菠菜网站做没作弊,全国企业名单大全目录 1.背景知识 2.gcc/g如何完成编译 (1) 预处理#xff08;进行宏替换#xff09; (2) 编译#xff08;生成汇编#xff09; (3) 汇编#xff08;生成机器可识别代码#xff09; (4) 链接#xff08;生成可执行文件或库文件#xff09; (5) 总结 (6) 函数库 …目录 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 文件里 [zytiZ2vcf9wvlgcetfeub9f11Z ~]$ gcc -E test.c -o test.i [zytiZ2vcf9wvlgcetfeub9f11Z ~]$ 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 [zytiZ2vcf9wvlgcetfeub9f11Z ~]$ gcc -S test.i -o test.s [zytiZ2vcf9wvlgcetfeub9f11Z ~]$ 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 [zytiZ2vcf9wvlgcetfeub9f11Z ~]$ gcc -c test.s -o test.o [zytiZ2vcf9wvlgcetfeub9f11Z ~]$ 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 [zytiZ2vcf9wvlgcetfeub9f11Z ~]$ gcc test.o -o test [zytiZ2vcf9wvlgcetfeub9f11Z ~]$ 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 # 运行一下 [zytiZ2vcf9wvlgcetfeub9f11Z ~]$ ./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 #includestdio.h2 int main()3 {4 printf(Hello!\n);5 return 0;6 } 用gcc完成编译后用 ldd,file 查看该文件详细信息: 得到的 test 是64位、可执行、动态链接的文件 。 链接的动态库就是libc-2.17.so这是系统里本来就预装的  [zytiZ2vcf9wvlgcetfeub9f11Z ~]$ 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静态库。 [zytiZ2vcf9wvlgcetfeub9f11Z ~]$ 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】 [zytiZ2vcf9wvlgcetfeub9f11Z ~]$ ll /usr/lib64/libc.a -rw-r--r-- 1 root root 5105516 Jun 4 23:05 /usr/lib64/libc.a然后再进行gcc静态编译发现这个可执行文件会特别的大。比之前动态链接生成的可执行文件大了100倍。用ldd、file观察也显示的是静态链接。 [zytiZ2vcf9wvlgcetfeub9f11Z ~]$ gcc test.c -o test -static [zytiZ2vcf9wvlgcetfeub9f11Z ~]$ 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 程序运行时所依赖的核心库之一。 [zytiZ2vcf9wvlgcetfeub9f11Z ~]$ 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 #includestdio.h2 #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不能与源代码中定义的宏相同  [zytiZ2vcf9wvlgcetfeub9f11Z ~]$ gcc test.c -o test -DN10 [zytiZ2vcf9wvlgcetfeub9f11Z ~]$ ./test Hello!100 Hello! hello N! ● -E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面 ● -S  编译到汇编语言不进行汇编和链接 ● -c  编译到目标代码 ● -o 文件输出到 文件 ● -static 此选项对生成的文件采用静态链接 ● -g 生成调试信息。GNU 调试器可利用该信息。 ● -shared 此选项将尽量使用动态库所以生成文件比较小但是需要系统由动态库. ● -O0 ● -O1 ● -O2 ● -O3 编译器的优化选项的4个级别-O0表示没有优化,-O1为缺省值-O3优化级别最高 ● -w  不生成任何警告信息。 ● -Wall 生成所有警告信息。
http://www.dnsts.com.cn/news/208360.html

相关文章:

  • h5网站制作报价网站建设要做什么
  • 免费招聘网站平台软件开发工程师是干嘛的
  • 中国联通网站备案及ip地址备案管理要求旧房改造室内装修设计公司
  • 做淘宝的网站网站开发有前途吗
  • 网页怎么注册重庆网站排名优化公司
  • 博物馆网站建设说明莱州网站建设公司电话
  • 如何在微信公众号内部做网站论坛推广平台有哪些
  • 网站修改联系方式免费下载百度一下
  • 福建工程建设管理中心网站珠海网站定制
  • 网站做edi认证有用没建设网站需要什么软件下载
  • 网站建设现状wordpress 游客评论
  • 长沙专业网站建设公司ps怎么做华为网站界面
  • 杭州建设教育网站品牌网站建设只询大蝌蚪
  • 海口网站制作公司茶叶网站的建设策划书
  • 网站建设需要的资质产品开发流程图模板
  • 网站做短视频业务许可查网站是否正规
  • 用闲置的安卓手机做网站服务器国外比较好的设计网站
  • wordpress美化导航菜单哈尔滨seo整站优化
  • 网站建设策划稿湖南省建三公司官网
  • 深圳建科技有限公司网站首页四川省住房和建设厅网站
  • 在ps中网站界面应做多大网页设计在哪里接单
  • 钓鱼网站的主要危害如何做网站本地服务器
  • 上海做网站运维的公司车陂手机网站开发
  • 厦门做网站找哪家公司wordpress网站源码分享
  • 个人网站背景图片上海个人网站建设
  • 最新网站建设语言互联网公司简介ppt范本
  • 微页制作网站模板下载软件专业企业网站搭建服务
  • 网站开发是哪个wordpress xiu 5.5
  • 找别人做网站可以提供源码吗小程序定制公司有哪些
  • 提供响应式网站建设东莞大岭山医院