C之编译和链接(十八)-创新互联
我们平时所做的编译工作其实是由编译器来完成的,那么编译器都是由哪几部分构成的呢?包括四大部分:预处理器、编译器、汇编器以及链接器组成。我们来看看一个由 file.c 文件是怎样得到 file.o 文件的,如下
成都创新互联公司成立与2013年,先为宜秀等服务建站,宜秀等地企业,进行企业商务咨询服务。为宜秀企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。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。
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
网页标题:C之编译和链接(十八)-创新互联
网站地址:http://scyanting.com/article/hgiio.html