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不需要,在嵌入式开发中需要将可执行程序移植到开发板时,如果是动态链接,则需要移植可执行程序和可执行程序所依赖的动态库文件,如果是静态链接,则仅需要移植可执行程序,库文件不需要移植。
下一篇中讲解了库文件的概念和制作方法,能进一步深刻理解链接的作用和意义。
c c++面试----c工程开发之链接的更多相关文章
- c c++面试c工程开发之宏定义和条件编译
多数c语言的初学者对c工程开发过程各个阶段的作用理解不到位,而这方面的的知识又是实际开发过程中经常用到的技能点,所以就成为面试考察中一个重要的考察方面.例如:头文件的作用.头文件的内容:链接的作用和意 ...
- c/c++面试----c工程开发之头文件
多数c语言的初学者对c工程开发过程各个阶段的作用理解不到位,而这方面的的知识又是实际开发过程中经常用到的技能点,所以就成为面试考察中一个重要的考察方面.例如:头文件的作用.头文件的内容:链接的作用和意 ...
- 这些HTML、CSS知识点,面试和平时开发都需要 No1-No4
系列知识点汇总 这些HTML.CSS知识点,面试和平时开发都需要 No1-No4(知识点:HTML.CSS.盒子模型.内容布局) 这些HTML.CSS知识点,面试和平时开发都需要 No5-No7(知识 ...
- 前端HR告诉你—如何面试Web前端开发
分享一篇HR前端面试心得: 面试前端工程师对我来说是一件非常有意思的事,因为面试过程很大程度上也是自我提升的过程.无论大公司还是小公司,之所以在如何招聘到真正有能力的,前端工程师方面会遇到同样的问题. ...
- 这些HTML、CSS知识点,面试和平时开发都需要 No1-No4(知识点:HTML、CSS、盒子模型、内容布局)
这些HTML.CSS知识点,面试和平时开发都需要 No1-No4 系列知识点汇总 这些HTML.CSS知识点,面试和平时开发都需要 No1-No4(知识点:HTML.CSS.盒子模型.内容布局) ...
- 如何面试Web前端开发
分享一篇HR前端面试心得: 面试前端工程师对我来说是一件非常有意思的事,因为面试过程很大程度上也是自我提升的过程.无论大公司还是小公司,之所以在如何招聘到真正有能力的,前端工程师方面会遇到同样的问题. ...
- 面试web前端开发,被打击了
今天我去面试web前端开发,被打击了,也跟我也有一定的关系,最基础的东西我都没回答好,哎! 主要是我在等我有意向的公司给我发offer,闲着没事,刚好又有公司叫我去面试,我抱着多面一家也没有啥子坏处就 ...
- 这些HTML、CSS知识点,面试和平时开发都需要 No5-No7
系列知识点汇总 这些HTML.CSS知识点,面试和平时开发都需要 No1-No4(知识点:HTML.CSS.盒子模型.内容布局) 这些HTML.CSS知识点,面试和平时开发都需要 No5-No7(知识 ...
- 这些HTML、CSS知识点,面试和平时开发都需要 No8-No9
系列知识点汇总 这些HTML.CSS知识点,面试和平时开发都需要 No1-No4(知识点:HTML.CSS.盒子模型.内容布局) 这些HTML.CSS知识点,面试和平时开发都需要 No5-No7(知识 ...
随机推荐
- java常用API之Calendar类
Calendar是日历类,该类将所有可能用到的时间信息封装为静态成员变量,方便获取. Calendar为抽象类,由于语言敏感性,Calendar类在创建对象时并非直接创建,而是通过静态方法创建,将语言 ...
- Lucene 初识
因为业务需要,虽然自己不是专门写搜索的,但是需要自己拼一些搜索条件去调用搜索的接口,而之前看的JVM crash里也涉及到了Lucene,所以大概了解一下. 参考文档: http://www.itey ...
- centOs升级
因为军佬放弃制作Centos7的网络重装包,又Centos7的安装引导和6有较大区别所以,选择曲线救国(技术不行,只能这样乱搞)前文:Centos6.9一键重装包https://ppx.ink/net ...
- MongoDB学习之mongoose
MongoDB介绍: MongoDB是基于Javascript语言的数据库,存储格式是JSON,而Node也是基于JavaScript的环境(库),所以node和mongoDB的搭配能减少因为数据转换 ...
- 用户选择wordpress程序建站需要知道的一些事情 - 安全、优化速度、配置
WordPress是我们使用最多的CMS程序之一,无论是我们的个人博客,还是企业网站,甚至中小型站点,我们都可以用WP程序部署.我们看到海外网站的时候,大部分都是用的WORDPRESS程序.在我们国人 ...
- AE多用户同时编辑同一个版本数据的解决方法
项目中做了入库的功能,测试一切正常,但是实际使用多个用户同时编辑default版本的时候,问题就来了,StopEditing 错误信息如下 FDO_E_VERSION_REDEFINED -21472 ...
- Android应用开发详解
目录结构 1.Android概述 2.Android开发基础 未完待续……
- 用ESP8266 WIFI模块连接服务器,并实现与服务器相互通讯
最近在做一个智能锁的项目,该项目要求实现在任何地方(当然是要有网络的)可以在手机上用APP开锁.而我负责的部分主要是实现底层与服务器连接,并且要能相互通讯.考虑了很多问题,最终选择了用ESP8266 ...
- lLinux安装JDK
1.在Linux中新建文件夹 mkdir /usr/local/java 2.上传jdk-7u55-linux-i586.tar到Linux中 3.解压文件 tar xzvf jdk-7u55-l ...
- JavaScript获取当前网页的源码
通过 outerHTML document.documentElement.outerHTML 通过异步请求 $.get(window.location.href,function(res){ con ...