繁体   English   中英

C ++共享库

[英]C++ shared libraries

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

我正在使用Linux 2.6.18-164.11.1.el5#1 SMP x86_64 GNU / Linux

我遇到了一个问题,我的代码无法在运行时拾取库。 我尝试设置LD_LIBRARY_PATH和PATH。 但是在运行该可执行文件时,在运行时出现以下错误:错误:librc.so:无法打开共享库文件:没有这样的文件或目录

山姆

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

在运行时,无论您是启动使用lib的程序,还是运行ldd来查找所需内容,操作系统都具有用于查找.so文件的系统,并且该版本可能因一个unix版本而异。 LD_LIBRARY_PATH变量指定在哪里查找.so文件,但可能不是完整的故事,具体取决于所讨论的确切Unix版本。 另外,您可能不想在修改LD_LIBRARY_PATH之外随意摆弄,因为它会带来系统范围的影响,因此只能扔掉外壳。 更好的选择是检查LD_LIBRARY_PATH设置的现有路径中是否缺少“ .so”文件,如果不是,请尝试将其副本放在该路径中的某个位置。

在运行时,将搜索动态库:

  • 在可执行文件中记录的路径中(在链接时带有-rpath的Linux下,在带有-R的Solaris下,在目录名中使用$ ORIGIN可以指定相对于包含可执行文件的目录的目录)

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM