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

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

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

生成静态连接库的步骤:

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

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

g++ -c printA.cpp
g++ -c printB.cpp

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

  • 不管是静态库文件仍是动态库文件,都是由 .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)将动态库文件拷贝至动态库搜索路径目录下

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

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

为此解决步骤为:test

将动态库文件 拷贝至目录 /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

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

相关文章
相关标签/搜索