liunx的编译与链接(7)
1.条件编译的现实用途1.软件根据收费情况进行条件编译来对代码进行动态裁剪2.不同硬件所需的内核代码不同可以采用条件编译来进行代码裁剪3.开发工具应用软件的代码采用条件编译来适配不同的操作系统2.要转换为汇编语言的原因是历史导致代码的本质是操作计算机。历史发展的操作为开关打孔编程0与1汇编语言同期生成编译器c语言c...因此c语言出现时汇编语言已经出现了很久了让c语言自己去生成二进制文件效率不高但先转换为汇编语言就快很多。同时汇编代码的编译器的底层是二进制经过包装后才用汇编语言实现的c语言的编译器的底层也是汇编经过包装才用c语言实现的总之转换为汇编的原因就是站在巨人的肩膀上了。因此编译器的语言自举就是一门新的语言的编译器的出现要用旧语言的编译器来封装加工来实现更新迭代的过程。3.链接头文件展开的是函数的声明源代码怎么可能随便让被别人看到因此链接的一部分也是用于连接外部库。库一套数据集给我们开发时所需的最基础的功能加速我们二次开发usr/lib64就有系统中存在的默认库。[rootVM-0-2-centos ~]# ls /usr/lib64 audit libEGL.so.1 libkdb5.so libpcre32.so.0.0.0 libulockmgr.so.1.0.1 bind9-export libEGL.so.1.1.0 libkdb5.so.8 libpcrecpp.so libunibilium.so.4 cifs-utils //很少的一部分一个库的真实名字是去掉lib前缀核去掉.so后缀时的剩下部分。libc.so //就是c语言的库4.链接再理解1.动态库有各种函数的源代码2.我们写的代码中有需要调用外部库中的函数的地方链接就是实现上面两步的从而形成可执行程序。链接分两种动态链接核静态链接动态链接给我们本地的程序知道了外部库中源代码函数的地址从而实现调用。调用动态库叫动态库调用从动态库回来叫动态库返回。动态库也叫共享库一旦缺失整个程序都无法运行。静态链接直接将外部库中对应函数的源代码块直接拷贝一份到本地代码处后续调用本地的函数。比较二者静态链接动态链接优点静态库缺失程序也依旧可以运行动态库形成的程序体积小动态库更省内存和磁盘缺点静态库形成的程序体积大动态库缺失程序无法运行程序在内存中运行时静态链接会出现大量重复代码gcc编译时可执行文件时默认动态链接[fengyouyinliVM-0-2-centos leeson]$ gcc test.c -o code [fengyouyinliVM-0-2-centos leeson]$ ls code test.c [fengyouyinliVM-0-2-centos leeson]$ file code code: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), //核心在这里 dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]a91b78a2aaa776590ede6b7c259cb2d72fcb2060, not stripped //此处说明了使用了动态库里面还有c语言库 [fengyouyinliVM-0-2-centos leeson]$ ldd code linux-vdso.so.1 (0x00007ffedffdb000) libc.so.6 /lib64/libc.so.6 (0x00007f50e4814000) /lib64/ld-linux-x86-64.so.2 (0x00007f50e4be2000)静态库没什么用就不讲了。只需知道静态文件会比动态文件大很多即可从内存角度看静态链接和动态链接在调用静态文件时静态库是不用加到内存中的因为静态文件所需的代码已经加载到文件中了在调用动态文件时动态库是要加到内存中的因为这样就可以同时给多个动态链接文件同时使用同一份代码实现内存的节约因此动态库确实应该叫共享库。5.多文件编译的方式将所有.c文件打包在一起同路径保留这些文件的头文件即可也就是头文件也要在一个目录中。将自己的代码给别人用时可以传.o的源文件和.h的头文件因为.c和.o都可以直接链接。别人跟据.h中的函数声明调用然后和他自己的.o(.c)文件一起链接即可。此时既可以实现共享代码的同时保密自己的代码因此链接的本质就是将所有要用到的.0文件进行链接。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2492721.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!