Oracle® Solaris Studio 12.4:C++ 用户指南

退出打印视图

更新时间: 2014 年 12 月
 
 

14.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
-library=stdcxx4 -lCrun -lc 
-lstdc++ -lgcc_s -lCrunG3 -lc 

前三组选项只能用于缺省的 -compat=5 模式中。第四组选项只能用于 -std=c++03-std=c++11 模式中。对于每个选项组,在其他所有库之后按给定顺序列出选项。

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

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

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

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