后台开发核心技术(一)编译与链接

本文详细解析了C++程序从源代码到可执行文件的全过程,包括预处理、编译、汇编和链接四个阶段。介绍了如何使用g++命令进行预处理、编译、汇编,并解释了静态链接和动态链接的区别及应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编译与链接的整个过程:

预处理Prepressing->编译Compilation->
汇编Assembly->链接Linking
编译与链接具体过程图
以helloworld作为例子展开:

  1. 预处理
    g++ -E hello.cpp -o hello.i -> hello.i
    (1) 将#define的内容替换
    (2) 处理条件预编译指令,如#if ,#ifdef等
    (3) 处理#include预编译指令
    (4) 过滤注释
    (5) 添加行号及文件标示便于编译报错
    (6) 保留#pragma编译器指令

  2. 编译+汇编
    g++ -S hello.cpp -o hello.s -> hello.s 高级语言编译成汇编指令文件
    g++ -c hello.cpp -> hello.o 汇编指令汇编为可供机器使用的机器语言(二进制)
    (1) 词法分析,扫描源代码文件,将字符序列分成一个个记号
    词法分析结果
    (2) 语法分析,将记号进行语法分析得到语法数,每一个结点是一个表达式。
    语法分析树
    (3) 语义分析,静态语义分析,分析语句是否真正有含义,包括类型的声明以及类型的匹配和转换。结束后,整个语法树的表达式都被标识了类型。
    语义分析后的语法树
    (4) 中间优化语言,对源代码级的表达式进行优化,如2+7直接为9。
    (5) 目标代码的生成及优化,鉴于不同的目标机器,将中间语言转化成合适的目标代码(不同的机器的类型字长等不相同),最后将其优化(乘法用偏移代替,合适的寻址方式等)。

编译的整个过程:
编译过程示意图
3. 链接
将每个源代码模块独立编译,然后按照要求组装起来的过程为链接。
原理:把一些指令对其它符号地址的引用加以修正,包括了地址和空间分配,符号决议,重定位这些步骤。
过程:将.o的目标文件和库一起链接形成最终可执行文件。库就是一组目标文件的包(最常用的代码编译成目标文件打包存放).
链接
采用自定义的add与sub来说明。
首先编写add.h,add.cpp,sub.h,sub.cpp,main.cpp

(1) 静态链接
对函数库的链接放在编译时期完成的是静态链接,库采用libxxx.a。

	g++ -o add.cpp
	g++ -o sub.cpp
	ar cr libmymath.a add.o sub.o //将两个目标文件放入静态库
	// ar命令的c选项为创建一个库,r选项为库中插入模块
	(ar tv libmymath.a可以查看静态库)
	g++ -o main main.cpp libmymath.a
	./main**

(2) 动态链接
把对一些库函数的链接载入退出到程序运行时期,采用libxxx.so。

	g++ -fPIC -shared -o libmymath.so add,.o sub.o**
	// -fPIC 编译为位置独立的代码,默认位置相关,动态载入时通过代码复制的方式满足不同进程的需要
	g++ -o main main.cpp libmymath.so
	./main** 

链接没有问题,在执行时报错,显示No such file or directory。原因是程序运行时会在/usr/lib等目录查找需要的动态库文件。
解决方法:将libmymath.so复制到/usr/lib,修改环境变量**LD_LIBRARY_PATH。

	cp libmymath.so /usr/lib
	export LD_LIBRARY_PATH=/usr/lib:$LD_LIBRARY_PATH
	sudo ldconfig**

(3) 静态库与动态库

  1. 在两个重名的静态库和动态库中,优先调用动态库。
  2. 在程序需要调用动态库中的函数时,会先在内存中查找有无库函数拷贝,没有才会复制。但是静态库会在每个程序中复制其库函数拷贝,造成大量的开销。
  3. 库函数发生变化时,静态库需要重新编译,动态库只要提供的接口没变,无需重新编译。
  4. 动态库的函数的调用可由程序员控制。
  5. 由于静态库的函数编译时已经加载了,因此程序执行的速度会快些。
后台开发核心技术应用实践 作者:徐晓鑫 著 出版日期:2016年08月06日 封面宣传语:腾讯云平台技术总监黄世飞、Facebook对外支付项目主程张子兴、微软软件工程师彭可竞、阿里巴巴资深算法工程师周乐、百度大数据高级测试工程师畅晋联袂推荐;围绕后台开发需要掌握的核心技术,从多个方面、多个角度进行了阐述,覆盖了该领域的几乎所有内容;充分抓住本质并结合实践,文字通俗易懂,可操作性强 出版书名:后台开发核心技术应用实践 作者:徐晓鑫 著 封底文字 专家评价 后台开发个“历史悠久”的领域,同时也是个沉淀深厚,高技术价值的领域。本书清晰、严谨、务实的风格显示出晓鑫对该领域知识的深刻理解。 ——张子兴 Facebook对外支付项目主程,美国加州MenloPark 每位从事后台开发的专业人士都需要后台开发指南。对每位想要认真从事该领域工作的人来说,本书是本绝对必读的书籍。 ——彭可竞 微软软件工程师,美国华盛顿州Redmond 本书是作者多年后台开发、架构和研究的精华。书中用通俗的文字、详尽的示例代码,结合实际工作中的案例,讲述了后台开发方方面面的知识,内容丰富。对于从事后台开发的人员,这是本很好的由浅入深的学习书籍。 ——周乐 阿里巴巴资深算法工程师,北京望京 使用C++语言进行后台开发定的门槛,本书可以很好地帮助你跨过这个“门槛”。 ——畅晋 百度大数据高级测试工程师,北京上地 前勒口 互联网网民日益剧增,各种应用层出不穷,各项技术更新不断。单是游戏行业,近几年就经历了从端游、页游到手游的巨大变迁,客户端更新迭代之快,始料未及。而后台开发中使用到的技术,却变化不是很大。让服务性能更高、处理能力更强、安全性更好,是后台开发工程师永恒的主题。 后台开发中用到的技术,深而广,需要读的“大部头”很多,光是Richard Stevens的APUE,UNP,TCP/IP详解就够读个半年以上。读者通过阅读本书,可以从实践出发,快速由浅入深地进入后台开发领域。在读完本书,有了实践的经验之后,再去阅读大师们的著作,会更有体会,更懂得如何欣赏。 读书的最高境界莫过于“把书读薄,把书读厚”。本书文字通俗易懂,让你更快地“读薄”,同时又涉及较多的核心知识点,顺着这些知识点,读着读着也发觉“读厚”了。 后勒口 徐晓鑫,腾讯资深软件研发工程师,先后在腾讯游戏之洛克王国、QQ会员、QQ秀等项目工作,精通后台开发各种技术,实战经验丰富。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值