Linux动态库编译及使用

生成动态库

生成动态库的命令和和生成可执行文件大致相同,区别在于加两个编译选项:

  • -fPIC 作用于编译阶段,告诉编译器生成位置无关代码;产生的代码中没有绝对地址,全部使用相对地址,所以代码可以被加载器加载到内存的任意位置。
  • -shared 生成动态链接库的选项
    此外,指定输出共享库名称的方式:-o lib{name}.so。

假如有三个源文件 a.cpp b.cpp c.cpp,需要生成一个动态库mylib。

可通过以下命令生成动态库:

1
gcc a.cpp b.cpp c.cpp -fPIC -shared -o libmylib.so

其他的一些编译选项需要额外指定。

库路径

linux默认一般有两个库路径:
/lib 和 /usr/lib

若要添加第三方的库路径,有两种方法:

  1. 将库复制到以上两个路径
  2. 修改 /etc/ld.so.conf 文件,将第三方库路径添加进去,然后运行ldconfig命令,把路径添加进 /etc/ld.so.cache 文件

编译时指定库路径

如果是第三方库,且没有将其添加进 ld.so.conf 文件,可在编译时采取临时办法,在编译选项中添加路径。

示例:

1
gcc main.cpp -L. -lmylib

其中 -L 指定链接库路径, -l指定链接库名称。
编译是默认优先选择动态库,若要链接静态库,添加 -static 编译选项。

运行时指定路径

如果是第三方库,且没有将其添加进 ld.so.conf 文件,在运行时,可将其临时添加进环境变量。

1
export LD_LIBRARY_PATH = {your_lib_path}:$LD_LIBRARY_PATH

两个有用的命令

file 查看文件类型
ldd 打印目标程序所链接的所有动态库信息

pkg-config的使用

假如自己开发了一个库mylib,那么会提供给别人头文件和库文件,用户使用的时候会在编译选项中将mylib的头文件和库添加进去。若只有一个库文件还好,若有多个库文件,写起来特别麻烦。

pkg-config就是为解决这个问题而生的一个工具。当我们提供给用户库和头文件时,同时提供一个mylib.pc文件,这个文件中记录了库的所有编译相关信息。用户只需要运行 pkg-config mylib -libs -cflags 就可以将相关的编译信息打印出来。

通常情况下,安装一个第三方库都会有一个安装脚本,直接将库文件和头文件以及 .pc文件安装到系统路径中,.pc文件中保存的路径信息就是安装时的信息。

pkg-cofnig 命令会到 /usr/lib路径下去查找所有 *.pc文件,或者到PKG_CONFIG_PATH环境变量指定的路径下查找。

参考:https://www.cnblogs.com/rainsoul/p/10567390.html