预编译,编译,汇编,链接,这些困扰我很久的东西今天是个了结了

       有时候真不好意思说自己是学计算机的,自己都不知道自己以前再干嘛。连预编译,编译,汇编,链接的基本原理都不懂。还好最近在旁边的人让我看com组件,让我对这些有了一点认识。虽然都是搬运,但我真的懂了哦 哈哈。

        看com组件的时候,看到一句话,com组件是以动态库为啥的那句话。动态库是啥,真是弱智啊,百度,动态链接库,啥是动态链接库,百度来竟然立马给个静态链接库,我也是醉了。于是就看到了二者的区别,网上的大神就说了,动态库和静态库的区别就是在链接的时候有区别,我也是醉了,小白啥都不懂啊。大神说,你看看静态库啊,其实就是最后和编译的一队obj文件在一起链接,然后生成可执行程序,动态库呢就是在程序执行的时候才将动态库中的代码啊,动态链接映射到可执行程序中。我擦,越看雾水越大。啥是obj,啥是链接啊。没办法,继续百度obj嘛,就是源代码编译然后汇编后的指令集吧(分为代码段和数据段)。我也是醉了。没办法,继续百度啥是编译,啥事汇编,呵呵,最后只能给出当头一棒子,预编译》》编译》》汇编》》链接》》可执行程序,额滴神啊,这都是一步套着一步啊。预编译我懂说白了就是替换啊,你看看的的cpp文件中经常有包含的.h啊,各种宏啊,预编译就是将.h文件中的代码替换到.cpp中,当然定义的宏也要被替换。这样预编译就完了,预编译完了就开始编译了,编译是干啥,就是将你的代码进行语义,语法的分析分析啥的,然后将其翻译成汇编语言或者是跟底层的中间语言,这一步也是着实艰辛啊,编译的过程中,编译器可不是傻子,它很牛的能优化你的代码,说白了 比如你定义了一个变量,整个程序中都没用到,编译器在编译过程中直接帮你干掉他,爽吧。是不是。中间代码或者汇编代买得到了,还没完说白了,机器只能看懂机器语言,学过计算机组成的都知道其实就是指令集,然后汇编的过程就是将这些代码翻译成指令集,那么我们第一个重要角色就要出场了,没错obj文件来了,这个就是上面说的代码段和数据段的集合。obj分为(粘贴的哈哈)1)可重定位文件:其中包含有适合于其它目标文件链接来创建一个可执行的或者共享的目标文件的代码和数据。
2)共享的目标文件这种文件存放了适合于在两种上下文里链接的代码和数据。第一种是链接程序可把它与其它可重定位文件及共享的目标文件一起处理来创建另一个目标文件;第二种是动态链接程序将它与另一个可执行文件及其它的共享目标文件结合到一起,创建一个进程映象。
3)可执行文件:它包含了一个可以被操作系统创建一个进程来执行的文件。汇编程序生成的实际上是第一种类型的目标文件。对于后两种还需要其他的一些处理方能得到,这个就是链接程序的工作了。这个时候就要链接登场了,链接就是将obj文件组合在一起,说白了就是他们之间的相互利用,比如你的一个文件中的调用的函数,是在另一个文件中定义的当然要链接下啊。当然链接分为静态链接和动态链接,静态链接就是直接将需要的链接起来然后组合成可执行文件,这样就结束了,链接的过程中是将所需要的代码段或者是数据段直接拷贝的,这样势必会造成可执行文件较大。这里就要再说动态链接了,动态链接说白了就是我链接在可执行文件中的是表述的一些函数的描述啊,这样在我执行的时候我再去将我要的链接的某些函数映射到内存中要执行地址空间,这样看看相当于压缩了执行文件的大小了。这样静态库和动态库的作用就知道了吧,静态库当然是为了静态链接的哦,我们已经有了静态,是不是很多东西都不需要中新编译了,直接在链接的时候拷贝到可执行文件中。动态库其实还需要引入库,这个引入库就是刚刚说要静态链接到可执行文件中来表述要动态链接的函数的东西。你想想那么动态和静态库存的优缺点就出来了。静态有点,可移植性好啊,你想想所有的东西我在编译的时候都拷贝了,怕啥,直接一个可执行文件就能运行可。然后缺点呢 就是胖,所有的东西都在里面,而且就是更新麻烦,因为你没更新一次 都要重新编译链接对吧。动态库就不一样了,动态库的可执行文件瘦啊,但是动态库的缺点就是万一你程序要调用的函数你那个电脑上没有那个动态库函数呢,崩溃哦。然后动态库还有个有点就是其在进程中实例化一个,多个程序就能共享,而静态库每个程序都有一个这个实例,浪费内存。说到这里,我竟然脑补充了静态绑定和动态绑定,c++中的虚函数会遇到动态绑定的问题,我一直在想这里怎么去动态链接呢,不负有心人啊,我猜虚函数的这动态连接就是上面说的3中obj文件中第二种

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值