多数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不需要,在嵌入式开发中需要将可执行程序移植到开发板时,如果是动态链接,则需要移植可执行程序和可执行程序所依赖的动态库文件,如果是静态链接,则仅需要移植可执行程序,库文件不需要移植。

下一篇中讲解了库文件的概念和制作方法,能进一步深刻理解链接的作用和意义。

    

c c++面试----c工程开发之链接的更多相关文章

  1. c c++面试c工程开发之宏定义和条件编译

    多数c语言的初学者对c工程开发过程各个阶段的作用理解不到位,而这方面的的知识又是实际开发过程中经常用到的技能点,所以就成为面试考察中一个重要的考察方面.例如:头文件的作用.头文件的内容:链接的作用和意 ...

  2. c/c++面试----c工程开发之头文件

    多数c语言的初学者对c工程开发过程各个阶段的作用理解不到位,而这方面的的知识又是实际开发过程中经常用到的技能点,所以就成为面试考察中一个重要的考察方面.例如:头文件的作用.头文件的内容:链接的作用和意 ...

  3. 这些HTML、CSS知识点,面试和平时开发都需要 No1-No4

    系列知识点汇总 这些HTML.CSS知识点,面试和平时开发都需要 No1-No4(知识点:HTML.CSS.盒子模型.内容布局) 这些HTML.CSS知识点,面试和平时开发都需要 No5-No7(知识 ...

  4. 前端HR告诉你—如何面试Web前端开发

    分享一篇HR前端面试心得: 面试前端工程师对我来说是一件非常有意思的事,因为面试过程很大程度上也是自我提升的过程.无论大公司还是小公司,之所以在如何招聘到真正有能力的,前端工程师方面会遇到同样的问题. ...

  5. 这些HTML、CSS知识点,面试和平时开发都需要 No1-No4(知识点:HTML、CSS、盒子模型、内容布局)

    这些HTML.CSS知识点,面试和平时开发都需要 No1-No4   系列知识点汇总 这些HTML.CSS知识点,面试和平时开发都需要 No1-No4(知识点:HTML.CSS.盒子模型.内容布局) ...

  6. 如何面试Web前端开发

    分享一篇HR前端面试心得: 面试前端工程师对我来说是一件非常有意思的事,因为面试过程很大程度上也是自我提升的过程.无论大公司还是小公司,之所以在如何招聘到真正有能力的,前端工程师方面会遇到同样的问题. ...

  7. 面试web前端开发,被打击了

    今天我去面试web前端开发,被打击了,也跟我也有一定的关系,最基础的东西我都没回答好,哎! 主要是我在等我有意向的公司给我发offer,闲着没事,刚好又有公司叫我去面试,我抱着多面一家也没有啥子坏处就 ...

  8. 这些HTML、CSS知识点,面试和平时开发都需要 No5-No7

    系列知识点汇总 这些HTML.CSS知识点,面试和平时开发都需要 No1-No4(知识点:HTML.CSS.盒子模型.内容布局) 这些HTML.CSS知识点,面试和平时开发都需要 No5-No7(知识 ...

  9. 这些HTML、CSS知识点,面试和平时开发都需要 No8-No9

    系列知识点汇总 这些HTML.CSS知识点,面试和平时开发都需要 No1-No4(知识点:HTML.CSS.盒子模型.内容布局) 这些HTML.CSS知识点,面试和平时开发都需要 No5-No7(知识 ...

随机推荐

  1. Android4.4 在Framework新增内部资源编译不过的问题

    如果在Frameworks新增内部资源,并在Java代码中使用类似形式来引用资源:com.android.internal.R.layout.xxx,需要在frameworks/base/core/r ...

  2. SQLAlchemy的使用---M2M多对多关系

    from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, Stri ...

  3. em和px区别

    附:(http://www.cnblogs.com/leejersey/p/3662612.html) em单位说明 1em指的是一个字体的大小,它会继承父级元素的字体大小,因此并不是一个固定的值.任 ...

  4. freebsd mount linprocfs

    mount用来做什么? to prepare and graft a special device or the remote node(rhost:path) on to the file syst ...

  5. java 将long类型的数值转无符号数

    由于JAVA中基本数据类型均为有符号数,而且最大数据类型long为8字节假如long为负数时,最高位为1,转为无符号数时会超出long的取值范围,所以转换规则如下: 方法: public static ...

  6. Android学习——Fragment静态加载

    从今天开始做一套安卓的学习笔记,开发环境是Android Studio,把学习过程中的知识和遇到的问题都写在这里,先从Fragment开始学起. Fragment概述 Fragment是Android ...

  7. SQL Server ->> DISABLE索引后插入更新数据再REBUILD索引 和 保留索引直接插入更新数据的性能差异

    之前对于“DISABLE索引后插入更新数据再REBUILD索引 和 保留索引直接插入更新数据的性能差异”这两种方法一直认为其实应该差不多,因为无论如何索引最后都需要被维护,只不过是个时间顺序先后的问题 ...

  8. C#设计模式之代理模式(三)

    15.4 远程代理   远程代理(Remote Proxy)是一种常用的代理模式,它使得客户端程序可以访问在远程主机上的对象,远程主机可能具有更好的计算性能与处理速度,可以快速响应并处理客户端的请求. ...

  9. 设计模式之简单工厂模式(Simple Factory)

    原文地址:http://www.cnblogs.com/BeyondAnyTime/archive/2012/07/06/2579100.html 今天呢,要学习的设计模式是“简单工厂模式”,这是一个 ...

  10. Django问卷调查项目思路流程

    Django问卷调查项目思路流程: 1 后端思路 : 需求分析 ---- 找出各实体对应关系 ---- 设计model架构 ---- 统一资源封装 --- 提供资源API入口 ---- 设计项目实体功 ...