需要帮助共享库

时间:2009-07-17 11:50:54

标签: shared-libraries cluster-computing

我有一个应用程序,我已经构建(使用g ++编写的c ++编译),使用共享库,当我在本地运行时,它可以正常工作,因为可以找到共享库,但是当我运行它时在libs仅安装在头节点上的集群上,我收到错误:

./ start:加载共享库时出错:

是否有编译器开关包含可执行文件中的所有共享库,因此可以解决必须更新整个集群的问题?

感谢

佰。

2 个答案:

答案 0 :(得分:1)

您不能在可执行文件中包含共享库,因此您必须静态链接到这些库。

在链接阶段执行此操作:-Wl,-static -lyourlib -Wl,-Bdynamic

这应该静态地链接到 yourlib ,以及动态链接到任何其他库。

答案 1 :(得分:1)

我想你确实想要使用共享库而不是静态库,所以我们不会讨论什么是更好的共享库或静态库以及何时使用它们 - 都有它们的优点和缺点。

如果您知道库在计算机上的位置,那么您正在运行应用程序并且此位置没有更改,您可以编译如下:

g ++ -Wl,rpath,full_path_to_libraries

这将嵌入二进制本身的路径。 如果未使用rpath,编译器将查找环境变量 LD_RUN_PATH 在编译时使用:

导出LD_RUN_PATH = full_path_to_libraries (对于bash)

g ++ .... (编译)

我个人更喜欢rpath,因为路径嵌入在你的代码中(例如makefile),如果你使用版本源控制系统,你总是可以知道如何使用路径。


还有其他方法可以指示运行时库的路径。 第一个是设置环境可变 LD_LIBRARY_PATH 。 您可以通过多种方式进行设置:

  • 在命令行中指示LD_LIBRARY_PATH

    〜:LD_LIBRARY_PATH = full_path_to_libraries my_application

  • 在〜/ .bashrc,/ etc / profile或命令行中设置 LD_LIBRARY_PATH 一次(导出LD_LIBRARY_PATH =路径(对于bash))然后执行您的应用程序
  • 以超级用户身份添加 /etc/ld.so.conf 文件中的库路径并执行 ldconfig 实用程序。之后,您可以执行您的应用程序,并找到您的库(请参阅man ldconfig)