Sun Studio 12:C++ 用户指南

12.6 使用共享库

以下共享库包括在 C++ 编译器中:

所出现的与程序链接的每个共享对象都记录在生成的可执行文件(a.out 文件)中,ld.so 使用该信息在运行时执行动态链接编辑。因为将库代码放入地址空间的工作会延迟,所以使用共享库的程序的运行时行为对环境的改变(也就是说,将库从一个目录移动到另外一个目录)是很敏感的。例如,如果程序与 /opt/SUNWspro/lib 中的 libcomplex.so.5 链接,而后来 libcomplex.so.5 移到 /opt2/SUNWspro/lib 中,则运行二进制代码时,会显示以下消息:


ld.so: libcomplex.so.5: not found

通过将环境变量 LD_LIBRARY_PATH 设置为新的库目录,不必对原来的二进制代码重新编译,仍可以运行它。

在 C shell 中:


example% setenv LD_LIBRARY_PATH \
/opt2/SUNWspro/release/lib:${LD_LIBRARY_PATH}

在 Bourne shell 中:


example$ LD_LIBRARY_PATH=\
/opt2/SUNWspro/release/lib:${LD_LIBRARY_PATH}
example$ export LD_LIBRARY_PATH

注 –

release 是特定于编译器软件的每个发行版。


LD_LIBRARY_PATH 中是一个目录列表(各目录之间通常用冒号分隔开)。运行 C++ 程序时,动态加载器先搜索 LD_LIBRARY_PATH 中的目录,再搜索缺省目录。

可使用以下示例中的 ldd 命令查看可执行文件中动态链接哪些库:


example% ldd a.out

因为共享库很少移动,所以一般并不需要该步骤。


注 –

如果使用 dlopen 打开共享库,必须使用 RTLD_GLOBAL ,异常才能生效。


有关使用共享库的更多信息,请参见《链接程序和库指南》。