码迷,mamicode.com
首页 > 其他好文 > 详细

C之编译和链接(十八)

时间:2018-04-12 03:00:07      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:C语言   编译   静态链接   动态链接   

        我们平时所做的编译工作其实是由编译器来完成的,那么编译器都是由哪几部分构成的呢?包括四大部分:预处理器、编译器、汇编器以及链接器组成。我们来看看一个由 file.c 文件是怎样得到 file.o 文件的,如下

技术分享图片

        a> 预编译:处理所有的注释,以空格代替;将所有的 #define 删除并且展开所有的宏定义;处理条件编译指令 #if, #ifdef, #elif, #else, #endif;处理 #include,展开被包含的文件;保留编译器需要使用的 #pragma 指令。预处理指令示例:gcc -E file.c -o file.i

        b> 编译:对预处理文件进行词法分析、语法分析以及语义分析;在分析结束后进行代码优化并生成相应的汇编代码文件。词法分析是指分析关键字,标识符及立即数等是否合法;语法分析是指分析表达式是否遵循语法规则;语义分析是指在语法分析的基础上进一步的分析表达式是否合法。编译指令示例:gcc -S file.i -o file.s

        c> 汇编:汇编器将汇编代码转变为机器可以执行的指令,每条指令语句几乎都对应一条机器指令。汇编指令示例:gcc -c file.s -o file.o

        总得来说编译过程分为预处理、编译、汇编和链接四个阶段,预处理就是处理注释,宏以及已经以 # 开头的符号;编译就是进行词法分析、语法分析以及语义分析;汇编就是将汇编代码翻译为机器指令的目标文件。

        那么链接器的作用主要是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正确的衔接。它分为静态链接和动态链接两种。

        a> 静态链接:指由链接器在链接时将库的内容直接加入到可执行程序中。关系如下

技术分享图片

       Linux 下静态库的创建和使用:1、编译静态库源码:gcc -c lib.c -o lib.o;2、生成静态库文件:ar -q lib.a lib.o;3、使用静态库编译:gcc main.c lib.a -o main.out

       b> 动态链接: 可执行程序在运行时才动态加载库进行链接,库的内容不会进入可执行程序当中。关系如下

技术分享图片

        Linux 下动态库的创建和使用:1、编译动态库源码:gcc -shared dlib.c -o dlib.so;2、使用动态库编译:gcc main.c ldl -o main.out;3、关键系统调用:dlopen:打开动态库文件,dlsym:查找动态库中的函数并返回调用地址,dlclose:关闭动态库文件。

        总得来说,链接是指将目标文件最终链接为可执行程序。根据链接方式的不同,链接过程可分为:静态链接,将目标文件直接链接进可执行程序;动态链接,在程序启动后才动态加载目标文件后面我们会继续对 C 语言的学习。


         欢迎大家一起来学习 C 语言,可以加我QQ:243343083

C之编译和链接(十八)

标签:C语言   编译   静态链接   动态链接   

原文地址:http://blog.51cto.com/12810168/2097189

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!