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(知识 ...
随机推荐
- OpenLayers 3 给features 添加手势
map.on('pointermove',function(e){ var pixel = map.getEventPixel(e.originalEvent); var hit = map.hasF ...
- DJango小总结二
1.Django请求的生命周期 武彦涛: 路由系统 -> 试图函数(获取模板+数据=>渲染) -> 字符串返回给用户 2.路由系统 王腾: ...
- 再写一篇ubuntu服务器的环境配置文
三年前写过一篇,但是环境和三年前比已经发生了比较大的变化,于是重新写一篇,自己以后再次配置也比较方便.我个人而言并没有觉得centos比ubuntu好用多少,所以继续选用ubuntu. 一.硬盘分区 ...
- node-sass安装失败的解决办法
安装node-sass一直失败,说起来还是自己把自己坑了,在度娘的帮助下我找到了下面这些资料: 资料1:FQ后再安装node-sass (无效),我使用的是lantern工具翻的墙 资料2:将yarn ...
- html+css定位篇
position absolute相对于父元素移动,不在父元素范围内时,可能和其他元素重叠 relative相对于初始位置来进行移动 fixed相对于浏览器进行定位,无论滑轮如何滚动,始终出现在浏览器 ...
- 云端基于Docker的微服务与持续交付实践
云端基于Docker的微服务与持续交付实践笔记,是基于易立老师在阿里巴巴首届在线技术峰会上<云端基于Docker的微服务与持续交付实践>总结而出的. 本次主要讲了什么? Docker Sw ...
- Android UI 切图命名规范、标注规范及单位描述(转载)
本文转自:https://blog.csdn.net/klxh2009/article/details/74938009 很多UI设计师做APP切图都会有两套,一套是Android的,一套是IOS的. ...
- MarkDown和流程图诠释你的代码
写在前面:首先感谢导师-猴哥对我的认可(求多分享点编程经验.工具.多开课),学习编程是一个痛苦和快乐的过程,希望大家共勉 本文介绍MarkDown的基本语法.使用MarkDown画简单的流程图.使用X ...
- ACCESS模糊查询注意事项
ACCESS模糊查询出现的问题,开发中需要注意!在SQL Server中模糊查询通常是这样的Select * from articleTable where authorName like '%jac ...
- 序列化Serializable
public interface Serializable 类的序列化由实现java.io.Serializable接口的类启用. 不实现此接口的类将不会使任何状态序列化或反序列化. 可序列化类的所有 ...