跳过导航链接 | |
退出打印视图 | |
Oracle Solaris Studio 12.3:C++ 用户指南 Oracle Solaris Studio 12.3 Information Library (简体中文) |
动态(共享)库的生成方式与静态(归档)库的生成方式基本相同,不过,您要在命令行上使用 -G 而不是 -xar。
不应直接使用 ld。与静态库一样,CC 命令可以确保使用模板时,模板系统信息库中所有必要的模板实例都包括在库中。在执行 main() 之前会调用与应用程序链接的动态库中所有静态构造函数,在 main() 退出之后会调用所有静态析构函数。如果使用 dlopen() 打开共享库,所有静态构造函数都在执行 dlopen() 时执行,所有静态析构函数都在执行 dlclose() 时执行。
应该使用 CC -G 来生成动态库。使用 ld(链接编辑器)或 cc(C 编译器)生成动态库时,异常可能无法生效,且库中定义的全局变量未初始化。
要生成动态(共享)库,必须使用 CC 的 –Kpic 或 –KPIC 选项编译每个对象来创建可重定位的目标文件。然后您就可以生成一个具有这些可重定位目标文件的动态库。如果遇到异常的链接故障,则可能是您忘记了使用 –Kpic 或 –KPIC 编译某些对象。
要生成名为 libfoo.so 的 C++ 动态库(该库包含源文件 lsrc1.cc 和 lsrc2.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。