多数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. [转]最全Redis面试题整理

    此为转载文章,仅做记录使用,方便日后查看,原文链接:http://www.bieryun.com/3405.html 1.什么是Redis? 答:Redis全称为:Remote Dictionary ...

  2. PAT 1066 Root of AVL Tree

    #include <cstdio> #include <cstdlib> class Node { public: Node* L; Node* R; int height; ...

  3. jquery hover(overListener, outListener) || bind('mouseover',methodA).bind('mouseout',methodB)

    1.区别: bind方式,进入外部区域和内部区域都会触发相关方法(methodA 或methodB): hover方式,进入内部区域不会再触发相关方法. 2.example: <body> ...

  4. JDBC实现动态查询

    一 概述 1.什么是动态查询? 从多个查询条件中随机选择若干个组合成一个DQL语句进行查询,这一过程叫做动态查询. 2.动态查询的难点 可供选择的查询条件多,组合情况多,难以一一列举. 3.最终查询语 ...

  5. html和css命名-望文生义

    HTML+CSS命名规则 在一个内容较多的HTML页面中,需要设计许多不同的框架,再为这些不同的框架及内容进行分类,给予相应的名称,从而使得网页结构更加清晰,也为工作提供了方便.许多新手朋友在设计一个 ...

  6. JavaScript数组常见操作

    JavaScript数组常见操作 Tip: 右键在新标签中打开查看清晰大图 下面介绍JavaScript中的数组对象遍历.读写.排序等操作以及与数组相关的字符串处理操作 创建数组 一般使用数组字面量[ ...

  7. Eclipse equinox implementation of OSGi

    Bundle package org.osgi.framework; public interface Bundle extends Comparable<Bundle> { int UN ...

  8. mongodb 3.4 学习 (五)备份&恢复

    备份恢复命令 mongodump -h 127.0.0.1 -p 27017 -o /opt/backup -u app -p '@app' --collection demo --db app -- ...

  9. js:JavaScript中的ActiveXObject对象

    JavaScript中的ActiveXObject对象作用: https://blog.csdn.net/pl1612127/article/details/77862174

  10. helm回滚应用

    helm状态显示为部署,但容器可能不是running 以下是helm的解释 大概意思是helm只要在k8s上执行完成就当做成功,容器部署到创建状态已经不在Helm的角色设定里了 执行回滚前先模拟下过程 ...