我有可执行文件,我需要在Google Compute引擎实例上进行部署。
可执行文件是用C ++编写的,依赖于几十个分片库。我仔细阅读some articles以了解Linux人员是如何做到这一点的。所以我选择 rpath 。我将所有内容放入名为shared
的文件夹中并放入
-Wl,--rpath=\\$$$ORIGIN/shared/
进入链接器的选项。语法有点花哨,但它应该在CodeLite IDE中看起来如何。我检查了可执行文件在该位置的运行时库中加载。然后我将它上传到GC实例。但是当我启动应用程序时,我收到错误:
加载共享库时出现错误:libGLEW.so.1.13:无法打开 共享对象文件:没有这样的文件或目录
libGLEW.so确实是应用程序尝试加载的第一个库。它的二进制文件位于“共享”文件夹中。我试图重新上传,重启机器,以su运行,打开权限......没有任何帮助。我的本地机器以及远程实例运行相同的操作系统(Ubuntu 16.04)可能有什么问题?
现在,更多关于 OpenGL :
UPDATE:我现在看到为什么无法加载libGLEW.so.1.13。libGLEW程序在运行时从默认位置加载它的共享库。我试图更改GLEW src代码加载从我的shared
文件夹路径。但出于某种原因,如果我从系统路径而不是从我的共享文件夹加载libGL.so,它不会加载OpenGL函数指针,即使SO加载到内存中也行。我完全摆脱了GLEW lib并尝试手动加载GL函数。但是,如果我从默认系统位置加载libGL.so,它无法加载GL函数地址。我对其他libs也有同样的问题。例如FFMPEG libavformat等。其中一些从默认位置加载libx264和libx265,因此在这种情况下我的共享文件夹的依赖项被完全忽略。有没有办法告诉所有这些lib从我的位置加载?我看到rpath只影响我用这个链接器选项编译的二进制文件。我的意思是,应该可以设置它,否则如何在Linux(如Web浏览器或游戏)上分发第三方软件?