动态库的创建与使用
1、动态库文件的创建
(1)编写源文件
(2)编译生成动态库
g++ -fPIC -shared -o libfile_operation.so file_operation.cpp
此编译过程分为两步,等同于下面的两个命令:
g++ -c -fPIC file_operation.cpp
-fPIC是编译选项,PIC是Position Independent Code的缩写,表示要生成位置无关的代码,这是动态库的特性
g++ -shared -o libfile_operation.so file_operation.o
-shared是链接选项,告诉g++生成动态库
2、编译链接动态库生成可执行文件
g++ main.cpp -L. -lfile_operation
-L指定搜索库的路径
-l指定链接的库名称
运行可执行文件
上图可以看到,可执行文件执行时出错,原因是找不到动态库。
Linux中,执行需要链接动态库的可执行文件时,是通过/etc/ld.so.cache文件搜索要链接的动态库的。而/etc/ld.so.cache是ldconfig程序读取/etc/ld.so.conf文件生成的(此文件中没有/lib和/usr/lib路径,ldconfig程序会默认搜索这两个路径)。
解决此问题有四种方法:
(1)将动态库所在路径添加到/etc/ld.so.conf中,然后以root权限执行以下ldconfig程序,这样就更新了/etc/ld.so.cache文件
(2)执行a.out时,通过LD_LIBRARY_PATH环境变量告诉a.out先在当前路径寻找链接的动态库,执行如下:
LD_LIBRARY_PATH=. ./a.out
或者先通过如下命令来添加动态库路径到环境变量,再直接执行./a.out
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/test (这种设置环境变量的方式,当退出当前终端时就会失效)。
(3)将动态库放到默认搜索的路径中,/lib或者/usr/lib
(4)在生成可执行文件时就告诉它在指定的路径找动态链接库,通过-Wl, -rpath命令,例如:g++ main.cpp -L. -lfile_operation -Wl,-rpath=/home/test