当前位置: 首页 > news >正文

宁夏固原住房和建设局网站免费云服务器

宁夏固原住房和建设局网站,免费云服务器,如何用wampp 做网站,网站开发设计费 怎么入账静态链接库与动态链接库 一、从源程序到可执行文件二、编译、链接和装入三、静态链接库与动态链接库四、静态链接库与动态链接库的制作与使用1.静态库的制作及使用2.动态库的制作及使用 一、从源程序到可执行文件 由于计算机无法直接理解和执行高级语言(C、C、Java…

静态链接库与动态链接库

  • 一、从源程序到可执行文件
  • 二、编译、链接和装入
  • 三、静态链接库与动态链接库
  • 四、静态链接库与动态链接库的制作与使用
    • 1.静态库的制作及使用
    • 2.动态库的制作及使用


一、从源程序到可执行文件

由于计算机无法直接理解和执行高级语言(C、C++、Java)程序,需要将高级语言程序转换为机器语言程序(机器语言是用二进制代码表示的、计算机唯一可以直接识别和执行的一种机器指令的集合),通常把这种转换过程叫做翻译

在C/C++中,整个翻译过程可以分为四步:

  • 预处理阶段预处理器对源程序进行 #include 头文件展开、#define 宏替换、#ifdef 条件编译以及行号和文件标识的添加等预处理操作,输出结果是一个以.i为扩展名的源文件。通过 g++ -E main.cpp > main.i 命令可以生成预处理信息并将预处理信息重定向到指定文件中。
  • 编译阶段编译器对预处理后的源程序进行词法分析、句法分析等编译操作,生成一个以.s为扩展名汇编语言源程序。汇编语言源程序中的每条语句都以一种文本格式描述了一条低级机器语言指令。通过 g++ -S main.cpp -o main.s 命令即可可以编译生成汇编文件。
  • 汇编阶段汇编器将汇编语言源程序翻译成机器语言指令,并把这些指令打包成一个以.o为扩展名的可重定位目标文件,它是一种二进制文件,因此用文本编辑器打开会显示乱码。通过 g++ -c main.cpp -o main.o 命令即可汇编生成可重定位目标文件。
  • 链接阶段链接器将多个可重定位目标文件链接库合并为一个可执行目标文件,或简称可执行文件,最终生成的可执行文件被保存在磁盘上。通过 g++ main.cpp -o main 命令即可实现从源程序到可执行文件的翻译过程。

在这里插入图片描述


二、编译、链接和装入

从操作系统程序执行的角度来看,一个程序想要放在内存中执行,除了上面的翻译过程(预处理、编译、汇编、链接),还需要对程序进行装入操作。

具体来说,编译是由编译程序对用户源程序进行编译,形成若干目标模块的过程,这些目标模块中的地址均为伪逻辑地址,即 0-100-100-10链接则是由链接程序将一组目标模块及所需库函数进行链接,形成一个完整的装入模块的过程,这个装入模块中的地址为逻辑地址,即 0 - 32。而装入则是由装入程序将装入模块装入内存,装入后形成的是物理地址,即 1000-1032

链接方式主要分为以下三种:

  • 静态链接:装入前链接成一个完整的装入模块,以后不再拆开。
  • 装入时动态链接:运行前装入内存时边装入边链接,便于对目标模块的修改、更新与共享。
  • 运行时动态链接:运行时需要目标模块才装入并连接,加快了程序装入,节省了内存空间。

装入方式也有三种:

  • 绝对装入:在单道程序环境下,编译时直接生成物理地址目标代码,直接按此地址装入。仅适用于单道程序,且要求程序员对内存极为熟悉,但实际上编程一般使用符号地址。
  • 可重定位装入:通过静态重定位在装入时将地址变换一次性完成,一次性装入。装入时必须分配固定大小全部空间,内存不足无法装入,不支持程序浮动。
  • 动态运行时装入:装入时不进行地址变换,直到运行时再借助重定位寄存器进行动态重定位。装入部分代码即可运行,可以分散存储,支持程序浮动,便于共享。

三、静态链接库与动态链接库

装入时动态链接还是运行时动态链接都属于动态链接,都是将部分链接操作推迟到程序执行时才进行,而动态链接一般需要使用动态链接库。而静态链接则是在生成可执行文件之前完成所有链接操作,使用的库文件被称作静态链接库

静态函数库一般命名为 libxxx.axxx.lib静态函数库在编译的时候会直接整合到目标程序中,所以利用静态函数库编译成的文件会比较大,这类函数库最大的优点就是编译成功的可执行文件可以独立运行,而不再需要向外部要求读取函数库的内容,但升级时如果函数库更新则需要重新编译

动态函数库一般命名为 libxxx.soxxx.dll。与静态函数库被整个编译到程序中不同,动态函数库只有当可执行文件需要使用到函数库的机制时,程序才会去读取函数库来使用,也就是说可执行文件无法单独运行,这样方便升级,只要替换对应动态库即可,不必重新编译整个可执行文件

静态库和动态库最本质的区别就是加载的时机,静态库在编译阶段就会加载到可执行文件中,而动态库会在执行阶段加载到可执行文件中


四、静态链接库与动态链接库的制作与使用

1.静态库的制作及使用

静态库的制作命令为:

g++ -c xxx.cpp -o xxx.o # 将目标源文件xxx.c编译成目标文件xxx.o
ar -rcs libxxx.a xxx.o # 使用ar工具制作静态库libxxx.a

lib_fun.h:

void func(int &num);

lib_fun.cpp:

#include "lib_fun.h"void func(int &num) {num++;
}

main.cpp:

#include <iostream>
#include "lib_fun.h"using namespace std;int main() {int x = 0;func(x);cout << x << endl;return 0;
}

首先我们使用 tree 命令查看一下当前目录结构,其中user目录模拟用户,lib目录模拟库。

atreus@iZwz9fsfltolu74amg1v0rZ:~/Code/lib_demo$ tree
.
├── lib
│   ├── lib_fun.cpp
│   └── lib_fun.h
└── user├── lib_fun.h└── main.cpp2 directories, 4 files
atreus@iZwz9fsfltolu74amg1v0rZ:~/Code/lib_demo$ 

我们在user目录下先编译一下main.cpp看一下效果,可以看到 func(int&) 声明了但没有定义,因为如果没有找到声明会直接报 was not declared in this scope

atreus@iZwz9fsfltolu74amg1v0rZ:~/Code/lib_demo$ cd user/
atreus@iZwz9fsfltolu74amg1v0rZ:~/Code/lib_demo/user$ g++ main.cpp -o main
/usr/bin/ld: /tmp/ccnh1mTY.o: in function `main':
main.cpp:(.text+0x2a): undefined reference to `func(int&)'
collect2: error: ld returned 1 exit status
atreus@iZwz9fsfltolu74amg1v0rZ:~/Code/lib_demo/user$ 

然后我们回到lib目录制作静态库,静态库的命名格式为 libxxx.a,并将制作好的静态库拷贝到user目录下cd。

atreus@iZwz9fsfltolu74amg1v0rZ:~/Code/lib_demo/user$ cd ../lib/
atreus@iZwz9fsfltolu74amg1v0rZ:~/Code/lib_demo/lib$ g++ -c lib_fun.cpp -o lib_fun.o
atreus@iZwz9fsfltolu74amg1v0rZ:~/Code/lib_demo/lib$ ar -rcs libfun.a lib_fun.o
atreus@iZwz9fsfltolu74amg1v0rZ:~/Code/lib_demo/lib$ cp libfun.a ../user/
atreus@iZwz9fsfltolu74amg1v0rZ:~/Code/lib_demo/lib$ tree ../
../
├── lib
│   ├── libfun.a
│   ├── lib_fun.cpp
│   ├── lib_fun.h
│   └── lib_fun.o
└── user├── libfun.a├── lib_fun.h└── main.cpp2 directories, 7 files
atreus@iZwz9fsfltolu74amg1v0rZ:~/Code/lib_demo/lib$ 

我们转到user目录下,重新进行编译,编译命令中的 -l 后面跟的是动态库的名字,即 libxxx.a 中的 xxx-L 后面跟的是静态链接库 libxxx.a 的存放位置,这里就在当前文件夹。可以看到,在链接了静态库之后就可以正常执行了。

atreus@iZwz9fsfltolu74amg1v0rZ:~/Code/lib_demo/user$ g++ main.cpp -l fun -L ./ -o main
atreus@iZwz9fsfltolu74amg1v0rZ:~/Code/lib_demo/user$ ./main 
1
atreus@iZwz9fsfltolu74amg1v0rZ:~/Code/lib_demo/user$ 

2.动态库的制作及使用

动态库的制作命令为:

g++ -shared -fPIC -o libxxx.so xxx.cpp # 制作动态库libxxx.so

首先我们依然是使用 tree 命令查看一下当前目录结构。

atreus@iZwz9fsfltolu74amg1v0rZ:~/Code/lib_demo$ tree
.
├── lib
│   ├── lib_fun.cpp
│   └── lib_fun.h
└── user├── lib_fun.h└── main.cpp2 directories, 4 files
atreus@iZwz9fsfltolu74amg1v0rZ:~/Code/lib_demo$ 

同样的,在lib目录下制作动态库,并将其拷贝到user目录下。

atreus@iZwz9fsfltolu74amg1v0rZ:~/Code/lib_demo/lib$ g++ -shared -fPIC -o libfun.so lib_fun.cpp
atreus@iZwz9fsfltolu74amg1v0rZ:~/Code/lib_demo/lib$ cp libfun.so ../user/
atreus@iZwz9fsfltolu74amg1v0rZ:~/Code/lib_demo/lib$ 

我们转到user目录下,重新进行编译,编译命令中的 ./libfun.so 即为动态库的存放路径。可以看到,在链接了动态库之后就可以正常执行了。

atreus@iZwz9fsfltolu74amg1v0rZ:~/Code/lib_demo/lib$ cd ../user/
atreus@iZwz9fsfltolu74amg1v0rZ:~/Code/lib_demo/user$ g++ main.cpp ./libfun.so -o main
atreus@iZwz9fsfltolu74amg1v0rZ:~/Code/lib_demo/user$ ./main 
1
atreus@iZwz9fsfltolu74amg1v0rZ:~/Code/lib_demo/user$ 

在这里插入图片描述

http://www.mmbaike.com/news/57390.html

相关文章:

  • 郑州做网站哪家公司好公司网站怎么弄
  • 阿里外贸平台网站建设接app推广接单平台
  • 聊城做网站的公司机构交换链接营销成功案例
  • 上饶网站开发 app开发最近的电脑培训班在哪里
  • 在ai中做网站图片怎么设置中国十大企业培训机构排名
  • 贸易网站怎么做推广普通话手抄报简单
  • 网站技术防护建设百度收录什么意思
  • 企业网站建设方案案例seo网上培训多少钱
  • wix怎么做网站五个成功品牌推广案例
  • 做娱乐网站需要哪些网络公司推广公司
  • 宠物网站开发功能需求备案域名交易平台
  • 网站建设公司做销售前景好不好?搜索引擎排名优化seo
  • 网站内部链接的策略站长之家seo
  • 毕业设计做网站有哪些方面网站维护推广的方案
  • 网站建设参考论文保定网站制作
  • 腾讯有服务器如何做网站怎么用网络推广
  • 深圳专门网站制作百度一下 官方网
  • 蒙古文网站建设工作情况汇报seo优化多久能上排名
  • 网站开发图书管理系统报告摘要企业微信管理系统
  • 国内的平面设计网站热门职业培训班
  • e点互动网站百度云网盘搜索引擎入口
  • 单页设计网站网址百度刷排名
  • 网站建设公司名称电商平台有哪些?
  • 云主机建立web网站网络营销策划的概念
  • 沈阳建设网站服务公司网络服务商在哪咨询
  • 优惠的网站快排公司电话2023新闻热点摘抄
  • 网站如何做收录排行seo优化的内容有哪些
  • 开发app外卖软件公司重庆seo博客
  • 静态网站入侵教程南宁网络推广有几家
  • 大气集团网站推广小程序