1

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

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

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

谢谢

奈杰尔。

4

2 回答 2

1

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

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

那应该静态链接到yourlib,并动态链接到任何其他库。

于 2009-07-17T12:19:06.397 回答
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=path(对于 bash)),然后执行您的应用程序
  • 作为超级用户在/etc/ld.so.conf文件中添加库路径并执行ldconfig实用程序。之后,您可以执行您的应用程序并找到您的库(请参阅 man ldconfig)
于 2009-07-17T13:28:14.693 回答