JavaScript is required to for searching.
跳过导航链接
退出打印视图
Oracle Solaris Studio 12.3:C++ 用户指南     Oracle Solaris Studio 12.3 Information Library (简体中文)
search filter icon
search icon

文档信息

前言

第 1 部分C++ 编译器

1.  C++ 编译器

2.  使用 C++ 编译器

3.  使用 C++ 编译器选项

第 2 部分编写 C++ 程序

4.  语言扩展

5.  程序组织

6.  创建和使用模板

7.  编译模板

8.  异常处理

9.  改善程序性能

10.  生成多线程程序

第 3 部分库

11.  使用库

12.  使用 C++ 标准库

13.  使用传统 iostream

14.  生成库

14.1 了解库

14.2 生成静态(归档)库

14.3 生成动态(共享)库

14.4 生成包含异常的共享库

14.5 生成专用的库

14.6 生成公用的库

14.7 生成具有 C API 的库

14.8 使用 dlopen 从 C 程序访问 C++ 库

第 4 部分附录

A.  C++ 编译器选项

B.  Pragma

词汇表

索引

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     

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

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

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

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