以下共享库包括在 C++ 编译器中:
libCrun.so
libC.so
libcomplex.so
libstlport.so
librwtool.so
libgc.so
libgc_dbg.so
libCstd.so
libiostream.so
所出现的与程序链接的每个共享对象都记录在生成的可执行文件(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 ,异常才能生效。
有关使用共享库的更多信息,请参见《链接程序和库指南》。