C ++共享库

时间:2010-05-14 15:09:14

标签: c++

我试图了解共享库在c ++ unix环境中的工作方式。我知道在编译代码时我们只需要头文件而没有共享库规范。但是,如果我想从编译的文件中创建可执行文件或共享库,是否需要指定共享库依赖项(那些是动态的)?并且共享库的路径是否需要在运行时加载时匹配路径?

我使用的是Linux 2.6.18-164.11.1.el5#1 SMP x86_64 GNU / Linux

我遇到的问题是我的代码无法在运行时获取库。我试过设置LD_LIBRARY_PATH和PATH。但在运行时,当我运行可执行文件时,我收到以下错误: 错误:librc.so:无法打开共享对象文件:没有这样的文件或目录

萨姆

2 个答案:

答案 0 :(得分:2)

标头仅用于编译阶段。在链接时,您通常必须指定要链接到的共享库。您可能会看到-L选项将位置设置为共享库所在的位置,和/或-l指定要链接的库。命令行上通常还有一个开关,用于警告链接器您是使用libs的线程安全版本还是“常规”版本,以及另一个指定动态链接的开关。

在运行时,无论是启动使用libs的程序,还是运行ldd来找出它需要的程序,操作系统都有一个用于定位.so文件的系统,这可能因unix版本而异。 LD_LIBRARY_PATH变量指定在哪里查找.so文件,但可能不是完整的故事,具体取决于所讨论的确切unix版本。此外,您可能不想在修改LD_LIBRARY_PATH之外,因为它具有系统范围的效果。一个更好的选择是检查“丢失”.so文件是否在LD_LIBRARY_PATH设置的现有路径上,如果没有,请尝试将它们的副本放在该路径上的某个位置。

答案 1 :(得分:0)

在运行时,搜索动态库:

  • 在可执行文件中记录的路径中(在linux下使用-rpath链接时,在Solaris下使用-R,在目录名中使用$ ORIGIN允许指定相对于包含可执行文件的目录的目录)< / p>

  • LD_LIBRARY_PATH中的
  • (或等效的,有时会有64/32位变体)。如果在可执行文件中记录了路径,则可能不会搜索LD_LIBRARY_PATH(在Linux下,如果可执行文件已与选项--enable-new-dtags链接,则在记录的路径之后搜索它;我现在不记得Solaris行为)

  • 在一组系统相关目录中(Linux允许在/etc/ld.so.conf中指定它们并具有缓存,请参阅ldconfig)