码迷,mamicode.com
首页 > 编程语言 > 详细

c++中编译链接总结

时间:2018-04-26 23:26:12      阅读:267      评论:0      收藏:0      [点我收藏+]

标签:静态   #define   FN   out   clu   后缀   编译链接   例子   sed   

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

例子:

代码如下

技术分享图片
 1 //main.cpp
 2 
 3 #include "add.h"
 4 #include "sub.h"
 5 #include "iostream"
 6 using namespace std;
 7 //演示静态链接
 8 int main(){
 9     cout<<"1+2="<<add(1,2)<<endl;
10     cout<<"1-2="<<sub(1,2)<<endl;
11     return 0;
12 }
View Code
技术分享图片
1 #include "sub.h" 
2 int sub(int a,int b){ 
3  return a-b; 
4 }
View Code
技术分享图片
1 //sub.h
2 #ifndef _SUB_H_
3 #define _SUB_H_
4 int sub(int a, int b);
5 #endif 
View Code
技术分享图片
1 //add.cpp
2 #include "add.h"
3 int add(int a, int b){
4     return a+b;
5 }
View Code
技术分享图片
1 //add.h
2 #ifndef _ADD_H_
3 #define _ADD_H_
4 int add(int a, int b);
5 #endif
View Code

(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++中编译链接总结

标签:静态   #define   FN   out   clu   后缀   编译链接   例子   sed   

原文地址:https://www.cnblogs.com/lanjianhappy/p/8955005.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!