Oracle Solaris Studio 12.2:C++ 用户指南

15.3 生成动态(共享)库

动态(共享)库的生成方式与静态(归档)库的生成方式基本相同,除了在命令行上使用 –G 而不是 –xar

不应直接使用 ld。与静态库一样,CC 命令可以确保使用模板时,模板系统信息库中所有必要的模板实例都包括在库中。在执行 main() 之前会调用与应用程序链接的动态库中所有静态构造函数,在 main() 退出之后会调用所有静态析构函数。如果使用 dlopen() 打开共享库,所有静态构造函数都在执行 dlopen() 时执行,所有静态析构函数都在执行 dlclose() 时执行。

应该使用 CC -G 来生成动态库。使用 ld(链接编辑器)或 cc(C 编译器)生成动态库时,异常可能无法生效,且库中定义的全局变量未初始化。

要生成动态(共享)库,必须使用 CC–Kpic–KPIC 选项编译每个对象来创建可重定位的目标文件。然后您就可以生成一个具有这些可重定位目标文件的动态库。如果遇到异常的链接失败,可能是忘记了使用 –Kpic–KPIC 编译某些对象。

要生成名为 libfoo.so 的 C++ 动态库(该库包含源文件 lsrc1.cclsrc2.cc 中的对象),请键入:


% CC -G -o libfoo.so -h libfoo.so -Kpic lsrc1.cc lsrc2.cc

-G 选项指定动态库的构造。-o 选项指定库的文件名。-h 选项指定共享库的内部名称。-Kpic 选项指定目标文件与位置无关。

CC -G 命令不会将任何 -l 选项传递给链接程序 ld。为了确保正确的初始化顺序,共享库对其所需的每个其他共享库必须具有显式的依赖性。要创建依赖性,请对每个此类库使用 -l 选项。典型的 C++ 共享库将使用以下几组选项之一:


-lCstd -lCrun -lc     
-library=stlport4 -lCrun -lc     

为了确保列出了需要的所有依赖性,请使用 -zdefs 选项生成库。对于缺少的每个符号定义,链接程序都会发出错误消息。要提供缺少的定义,请针对这些库添加 -l 选项。

要确定是否包含了不需要的依赖性,请使用以下命令


ldd -u -r mylib.so     
ldd -U -r mylib.so

然后可以重新生成没有不需要的依赖性的 mylib.so