学习总结:静态链接和动态链接

链接可分为静态链接和动态链接

静态链接:对函数库的链接是放在编译时期完成的是静态链接

生成静态链接库的步骤:

(1)先将源文件编译成 .o 文件:

(源文件可从上一篇查看)

g++ -c printA.cpp

g++ -c printB.cpp

生成的文件为 printA.o printB.o ,-c 的编译选项,表示只执行到编译,输出目标文件。

  • 无论是静态库文件还是动态库文件,都是由 .o 文件创建的

(2)由 .o 文件创建静态库(.a 文件),执行命令:

ar cr libmyprint.a printA.o printB.o

生成的静态库文件就是libmyprint.a,命名规范是以lib 开头(前缀),紧接着是静态库名,以.a为后缀名

ar 命令的 c 选项:创建一个库。

ar 命令的 r 选项:在库中插入模块(替换);如果若干模块中有一个模块在库中不存在,ar会显示一个错误信息,并且不替换其他同名模块。

(3)在程序中使用静态库,链接生成可执行文件:

g++ -o main main.cpp -L. -lmyprint

动态链接:程序运行到要调用待链接的库函数时,才链接载入,拷贝至内存,内存已有不重复载入。

生成动态链接库的步骤:

(1)先将源文件编译成位置独立的.o文件

g++ -fPIC -o printA.o -c printA.cpp

g++ -fPIC -o printB.o -c printB.cpp

(2)由 .o 文件创建动态库(.so 文件),执行命令:

g++ -shared -o libmyprint.so printA.o printB.o

(1) ,(2)也可以一步到位:

g++ -fPIC -shared -o libmyprint.so printA.cpp printB.cpp

(3)将动态库文件拷贝至动态库搜索路径目录下

动态库的搜索路径的先后顺序是:

  • 编译目标代码时指定的动态库搜索路径
  • 环境变量 LD_LIBRARY_PATH 指定的动态库搜索路径
  • 配置文件 /etc/ld.so.conf 中指定的动态库搜索路径;即只需在该文件中追加一行库所在的完整路径如“root/test/conf/lib”即可,然后ldconfig使修改生效
  • 默认的动态搜索路径 /lib
  • 默认的动态库搜索路径 /usr/lib

为此解决步骤为:

将动态库文件 拷贝至目录 /usr/lib 中

cp libmyprint.so /usr/lib/

修改环境变量 LD_LIBRARY_PATH,并使修改生效

export LD_LIBRARY_PATH=/usr/lib:$LD_LIBRARY_PATH

sudo ldconfig

(4)在程序中(隐式)使用动态库,链接生成可执行文件

g++ -o main main.cpp -L. -lmyprint

代码和静态库生成可执行文件一样

选项备注:

-fPIC :表示编译为位置独立的代码

-Lpath:表示从path 目录中搜索库文件,若从当前路径 . 查找,选项为 -L. (有一点)

-Iname:name为动态库的真正名字,编译器查找动态链接库时有隐含的命名规则,即在给出的名字前面+lib,后面加.so确定库的名称,即实际动态库文件名为 libname.so

参考:《后台开发核心与应用实践》

原文地址:https://www.cnblogs.com/pz-Feng/p/8284370.html

时间: 2024-11-12 21:33:31

学习总结:静态链接和动态链接的相关文章

linux 静态链接和动态链接

链接 一个可执行目标文件的生成需要经过预编译(g++ -E).编译(g++ -S).汇编(g++ -c).链接四个步骤.链接是将多个可重定位目标文件合并到一个目标文件的过程.链接由链接器完成,链接器重要完成两个任务: 1.符号(符号表由汇编器构造)解析.也就是将符号引用和符号定义关联起来.其中符号定义和符号引用可能不在同一个目标文件中.而且链接器对多重定义的全局符号的解析有一定的规则:不允许有多个同名强符号(函数和初始化了的全局变量).如果有一个强符号和多个弱符号同名选择强符号.如果有多个弱符号

静态链接与动态链接的区别(转载)

1.转载:http://www.cnblogs.com/kex1n/archive/2011/09/06/2168435.html 动态链接库.静态库.import库区别 动态链接库(Dynamic Linked Library):Windows为应用程序提供了丰富的函数调用,这些函数调用都包含在动态链接库中.其中有3个最重要的DLL,Kernel32.dll,它包含用于管理内存.进程和线程的各个函数: User32.dll,它包含用于执行用户界面任务(如窗口的创建和消息的传送)的各个函数:GD

CodeBlocks静态链接与动态链接设置

静态库和动态库的区别 1.静态库 之所以称之为"静态库",是因为在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中.因此对应的链接方式称为静态链接. 从本质上来说,一个静态库可以简单看成是一组目标文件(.o/.obj文件)的集合,静态库与汇编生成的目标文件(.o/.obj)一起链接为可执行文件. 静态库(后缀为.a/.lib)和.o文件格式相似.即很多目标文件经过压缩打包后形成的一个文件 静态库特点总结: 1. 静态库对函数库的链接是放在编译时期完成的 2.

C的日记-静态链接和动态链接

[静态链接和动态链接]    静态链接:源程序编译之后,如果想要执行,先对目标文件进行链接,链接完成后如果执行了,就把链接好的都装载进内存    缺点:        <1>如果一个目标文件被重复使用,每次都会把目标文件载入内存,造成浪费:        <2>如果相对某个目标文件进行更新,需要先把这个目标文件重新编译+链接,然后重新载入内存.    动态链接:在程序开始运行后(装载到内存)才开始把目标文件依次加载到内存然后编译成可执行文件    优点:        <1&

静态链接和动态链接

1.实例代码 //add.c#include"tmath.h" int tadd(int x,int y) { return x+y; } int tsub(int x,int y) { return x-y; } //mul.c #include"tmath.h" int tmul(int x, int y) { return x*y; } int tdiv(int x,int y) { return x/y; } //main.c #include<std

程序的静态链接,动态链接和装载

一.程序编译链接的整体流程 通常我们使用gcc来生成可执行程序,命令为:gcc hello.c,默认生成可执行文件a.out 其实编译(包括链接)的命令:gcc hello.c 可分解为如下4个大的步骤: 预处理(Preprocessing) 编译(Compilation) 汇编(Assembly) 链接(Linking) gcc compilation 1.       预处理(Preproceessing) 预处理的过程主要处理包括以下过程: 将所有的#define删除,并且展开所有的宏定义

linux学习 建立静态库,动态库,写简单的makefile

建立静态库 建立四个文件 bin(可执行文件),lib(库),include(头文件),src(放源文件) 这里的起的库明为add 在src文件中执行 1)gcc -c add.c //编译add.c源文件生成add.o目标文件 2)ar crsv ../lib/ libadd.a add.o //对目标文件*.o进行归档,生成lib*.a, 把这个生成文件放在lib里 3)gcc -o main main.c -L(大些的爱偶,放库的路径)../lib   –l(小写的爱偶,库名为add) a

JAVA学习篇--静态代理VS动态代理

本篇博客的由来,之前我们学习大话设计,就了解了代理模式,但为什么还要说呢? 原因: 1,通过DRP这个项目,了解到了动态代理,认识到我们之前一直使用的都是静态代理,那么动态代理又有什么好处呢?它们二者的区别是什么呢? 2,通过学习动态代理了解到动态代理是一种符合AOP设计思想的技术,那么什么又是AOP? 下面是我对它们的理解! 代理Proxy: Proxy代理模式是一种结构型设计模式,主要解决的问题是:在直接访问对象时带来的问题 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对

Java设计模式学习06——静态代理与动态代理(转)

原地址:http://blog.csdn.net/xu__cg/article/details/52970885 一.代理模式 为某个对象提供一个代理,从而控制这个代理的访问.代理类和委托类具有共同的父类或父接口,这样在任何使用委托类对象的地方都可以使用代理类对象替代.代理类负责请求的预处理.过滤.将请求分配给委托类处理.以及委托类处理完请求的后续处理. 二.代理模式结构 UML类图: 由上图代理模式的结构为: 抽象角色: 真实对象和代理对象的共同接口. 代理角色: 代理对象角色内部含有对真实对