我有一个应用程序,我已经构建(使用g ++编写的c ++编译),使用共享库,当我在本地运行时,它可以正常工作,因为可以找到共享库,但是当我运行它时在libs仅安装在头节点上的集群上,我收到错误:
./ start:加载共享库时出错:
是否有编译器开关包含可执行文件中的所有共享库,因此可以解决必须更新整个集群的问题?
感谢
佰。
答案 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