c++中编译链接总结
1 编译链接过程分为 预处理--->编译---->汇编---->链接。如下图所示
2 预处理都做了什么
(1)将所有的#define删除并展开所有的宏
(2)处理所有的条件预编译指令比如#if #ifdef
(3)处理#Incldue预编译指令,将包含的文件插入到预编译的文件中。采用头文件的目的是可以供多个不同的cpp源程序使用。自己定义的通常用“”,如果包含库文件的一般是“<>”.
(4)过滤所有的注释符号
(5)添加行号和文件标识。方便再编译器产生调试用的行号信息等
(6)保留所有的#pragma编译器指令。
3 编译
(1)将预处理完成的文件进行一系列的词法分析,语法分析等产生汇编代码文件。
g++ -S hello.i -o hello.s可以通过打开helloword.s查看汇编代码。
4 链接
(1)将链接的模块独立地编译然后组装起来,这就是链接啦
(2)最基本的静态链接过程如下图所示
(3)库也就是一组目标文件的包,将代码编译成目标文件以后打包存放。
(4)静态链接
对函数库的链接放在编译时期完成的是静态链接。目标文件和相关的函数库被合成一个可执行文件。通常为libxxx.a
例子:
代码如下
//main.cpp #include "add.h"
#include "sub.h"
#include "iostream"
using namespace std;
//演示静态链接
int main(){
cout<<"1+2="<<add(1,2)<<endl;
cout<<"1-2="<<sub(1,2)<<endl;
return 0;
}
#include "sub.h"
int sub(int a,int b){
return a-b;
}
//sub.h
#ifndef _SUB_H_
#define _SUB_H_
int sub(int a, int b);
#endif
//add.cpp
#include "add.h"
int add(int a, int b){
return a+b;
}
//add.h
#ifndef _ADD_H_
#define _ADD_H_
int add(int a, int b);
#endif
(4-1)先将cpp编译成.o文件
g++ -c add.cpp
g++ -c sub.cpp 注意 动态和静态链接都是由.o文件船舰
(4-2).o---->.a文件 ar cr libmymath.a sub.o add.o 这样会生成libmymath.c文件如下图所示
注意:库文件规范一般就是以lib开头 然后静态库名 .a后缀名
r:在库中插入模块
c:创建一个库
(4-3)使用静态库
g++ -o main main.cpp -L -lmymath这样生成main文件
(5)动态链接
(5-1)静态链接是在编译时期,那么动态可以推迟到运行时期。扩展名.so
(5-2)生成方法
g++ -fPIC -shared -o libmymath.so add.cpp sub.cpp
编译参数解析:
-fPIC:编译为位置独立的代码
-Lpath:path目录搜索库文件 -L便是当前目录
-Ipath:表示path目录中搜索文件
-ltest:编译器查找动态链接库时候有隐含的命名规则则名字前面lib 后缀.so
注意:运行的时候g++ -o main main.cpp -L. -lmymath链接正常但是执行会出错。主要是找不到.so。因为程序运行
会在/usr/lib和/lib中找相应的动态库文件。解决方法:将libmymath.so复制到目录/user/lib中
(6)静态链接和动态链接各自的特点
6-1:程序运行的时候,操作系统会看内存是否有库函数的拷贝,有的话就不会链接载入,这样节省勒内存资源。静态库则不同,每个程序都会将这个库函数拷贝到自己的代码段中,这样就占用了内存资源。
6-2 用静态库,如果库发生了变化,使用的库需要重新编译。动态库则不会,提供的接口不会变化,只是重新用新生成的动态库替换就ok
加油----->一天快结束了。。
c++中编译链接总结的更多相关文章
- Ubuntu中编译链接Opencv应用的简便方式
安装完毕Opencv后,使用下面命令查 看编译/连接參数 pkg-config --cflags --libs opencv 可看到例如以下信息 -I/usr/include/opencv /usr ...
- 【原创】Linux下编译链接中常见问题总结
前言 一直以来对Linux下编译链接产生的问题没有好好重视起来,出现问题就度娘一下,很多时候的确是在搜索帮助下解决了BUG,但由于对原因不求甚解,没有细细研究,结果总是在遇到在BUG时弄得手忙脚乱得. ...
- 加快XCode的编译链接速度(200%+)—XCode编译速度慢的解决方案
最近在开发一个大项目的时候遇到一个很头疼的问题,由于项目代码较多,每次都要编译链接1分钟左右,调试的时候很浪费时间,于是研究了一下如何提高编译链接的速度,在这里分享给大家. 提升编译链接的速度主要有以 ...
- C++开始前篇,深入编译链接(3)
一,COMMON块 什么是COMMON块,这是一种机制,早期的Fortran没有动态分配空间的机制,程序员必须事先声明它所需要的临时使用空间的大小.Fortran把这种空间叫做COMMON块,当不同的 ...
- C++开始前篇,深入编译链接
C++开始,为什么要写这个东西,因为按照课堂进度的话,现在的C++已经学到模板以及重载了,有时却仍然因为一些小问题无法解答,原因是忘记了开始时学到的知识,深知不能像猴子掰棒子一样,掰一个扔一个,因此, ...
- VS编译链接时错误(Error Link2005)的解决方法
近期参与的项目中使用了公司另外一个同事提供的一个静态库文件.该静态库文件集成了CUDA, OpenCL两个库,用于做图形加速计算,提高视频解码拼接速度.但是在编译链接项目时,VS爆出如下错误: 1&g ...
- 如何在 Delphi 中静态链接 SQLite
搞了我几个小时,终于成功在 Delphi 中静态链接了 SQLite (v3.5.4),下一步就是研究加密了,呵呵中间其实遇到很多问题,今天累了,就不说了,改天补上 下载测试工程 下面说说方法 1.当 ...
- GCC编译器编译链接
在gcc编译器环境下,常见的文件扩展名的含义如下: .c:C源程序,经过预编译后的源程序也为.c文件,它可以通过-E参数输出. .h:头文件 .s:经过编译得到的汇编程序代码,它可以通过-S参数输出. ...
- C语言编译链接
转载请标明: 编译链接是使用高级语言编程所必须的操作,一个源程序只有经过编译.链接操作以后才可以变成计算机可以理解并执行的二进制可执行文件. 编译是指根据用户写的源程序代码,经过词法和语法分析,将高级 ...
随机推荐
- windows下taskkill命令简介
1.简介 使用该工具可以按照进程 ID (PID) 或映像名称终止任务. 2.语法 TASKKILL [/S system [/U username [/P [password]]]] ...
- javascript 高级编程系列 - 继承
1. 原型链继承 (缺点:子类继承父类的引用类型的属性值会在各个实例中共享,创建子类实例时无法向父类构造函数传递参数) // 定义父类构造函数 function SuperClass(father, ...
- mini2440使用jlink烧写superboot到norflash
Jlink版本号:J-flash ARM V4.12 J-Flash ARM的配置. 一般说来file-->open project里面会找到一些*.jfl ...
- 浅析嵌入式C优化技巧
嵌入式C语言优化小技巧 1 概述 嵌入式系统是指完毕一种或几种特定功能的计算机系统,具有自己主动化程度高,响应速度快等长处,眼下已广泛应用于消费电子,工业控制等领域.嵌入式系统受其使用的硬件以及运行环 ...
- vmware workstation14永久激活密钥
vmware workstation14永久激活密钥分享: CG54H-D8D0H-H8DHY-C6X7X-N2KG6 ZC3WK-AFXEK-488JP-A7MQX-XL8YF AC5XK-0ZD4 ...
- 【BZOJ2339】[HNOI2011]卡农 组合数+容斥
[BZOJ2339][HNOI2011]卡农 题解:虽然集合具有无序性,但是为了方便,我们先考虑有序的情况,最后将答案除以m!即可. 考虑DP.如果我们已经知道了前m-1个集合,那么第m个集合已经是确 ...
- EasyDarwin Streaming Server对Task的调用方法
我们在EasyDarwin流媒体服务器的二次开发过程中,经常会需要定义自己的Task类,例如在EasyDarwin中,RTSPSessioin.HTTPSession.RTCPTask等,都是Task ...
- Java类加载器( 死磕9)
[正文]Java类加载器( CLassLoader ) 死磕9: 上下文加载器原理和案例 本小节目录 9.1. 父加载器不能访问子加载器的类 9.2. 一个宠物工厂接口 9.3. 一个宠物工厂管理 ...
- 当半导体的工艺制程走到7nm后
https://mp.weixin.qq.com/s/LjFTtEKFX2o8kLjn3y6GbQ 深度学习的异构加速技术1:效率因通用而怠,构架为AI而生 一方面,当半导体的工艺制程走到7nm后,已 ...
- 什么是 CAS 机制?
1.Synchronized关键字 Synchronized关键字会让没有得到锁资源的线程进入BLOCKED状态,而后在争夺到锁资源后恢复为RUNNABLE状态,这个过程中涉及到操作系统用户模式和内核 ...