c c++面试----c工程开发之链接
多数c语言的初学者对c工程开发过程各个阶段的作用理解不到位,而这方面的的知识又是实际开发过程中经常用到的技能点,所以就成为面试考察中一个重要的考察方面。例如:头文件的作用、头文件的内容;链接的作用和意义;条件编译的作用等等此类问题,接下来将c工程开发过程中的各种问题进行总结使大家能够自如应对这方面的面试题目。
c工程开发经过以下几个阶段:
编辑--》预处理--》编译--》汇编--》链接--》运行--》调试
编译阶段作用:将预处理后的c源程序翻译成汇编程序。
汇编阶段作用:将编译后的汇编程序翻译成目标程序(二进制程序)。
链接阶段作用:将多个目标程序和库文件进行统一链接产生可执行程序。
编译阶段和汇编阶段比较好理解,面试过程中会围绕链接展开一些问题,
例如:程序开发过程中为什么要链接?
链接的主要作用是什么?
列出链接过程中可能的错误并给出解决方案。
请简单叙述使用一个第三库的步骤。
本篇主要围绕程序链接阶段作用展开,同时为了更好理解链接,下一篇中讲解静态库文件和动态库文件的制作方法,目的使读者更好的掌握库文件的作用和意义,学会使用第三方库文件并对链接有较深入的理解。
一、链接的作用
项目开发时,所有的源代码不可能组织到一个文件中,一个文件的函数中几乎都要调用库函数、第三方的函数或者其它文件中的函数,那么多个源文件中的程序最终如何生成一个可执行程序,解决的方法是:多个目标需要统一链接,需要和库文件链接产生一个可执行程序,该程序可以单独运行,即通常所说的“单独编译,统一链接”。
例如:工程中有多个文件main.c sql.c connect.c,则这三个文件如何编译成可执行程序。
用gcc编译该工程
gcc -c main.c -o main.o
gcc -c sql.c -o sql.o
gcc -c connect.c -o connect.o
gcc main.o sql.o connect.o -o res -l库文件名
以上是编译该工程的方法,使用哪种库文件,则参数-l后跟相关库文件的名字。链接通俗的理解就是从各个目标文件中获取每一个函数模块的二进制代码,组合在一起形成一个真正的可执行程序的过程。
二、链接的分类:
根据链接的方式不同链接分为静态链接和动态链接,库文件分为静态库文件和动态库文件
静态链接:链接静态库文件(libxxx.a),
产生可执行程序相对较大,程序运行不需要库文件支持
动态链接:链接动态库文件(共享库文件 libxxx.so),
相对程序较小,程序运行需要动态库文件的支持
默认链接是动态链接,-static指明是静态链接
例:通过gcc用两种方式实现对同一个文件进行链接,产生两种可执行程序,试进行比较。
给出一个简易的程序main.cpp,源代码如下:
#include <stdio.h>
int main()
{
int data = 0;
char ch = 0;
int *p = &data;
char *q = &ch;
printf("%ld %ld\n",sizeof(p),sizeof(q));
return 0;
}
采用动态链接生成可执行程序res1
gcc main.c -o res1
采用静态链接生成可执行程序res2
gcc main.c -o res2 -static
以下是两个文件的详细信息,可以看出res2比res1大了很多,res2是静态链接,res1是动态链接。
-rwxrwxr-x 1 hua hua 8664 4月 3 10:28 res1
-rwxrwxr-x 1 hua hua 912744 4月 3 10:28 res2
两个程序的功能完全相同,res1的运行需要库文件支持,res2不需要,在嵌入式开发中需要将可执行程序移植到开发板时,如果是动态链接,则需要移植可执行程序和可执行程序所依赖的动态库文件,如果是静态链接,则仅需要移植可执行程序,库文件不需要移植。
下一篇中讲解了库文件的概念和制作方法,能进一步深刻理解链接的作用和意义。