C++ 我的朋友可以';我不能在他的linux发行版上运行我的openGL程序

C++ 我的朋友可以';我不能在他的linux发行版上运行我的openGL程序,c++,linux,opengl,ubuntu,debian,C++,Linux,Opengl,Ubuntu,Debian,我正在ubuntu上编写一个opengl应用程序,它的编译和运行都很好。但是当我把我的程序(是的,是在发布模式下编译的程序)发送给我的朋友,我认为他运行的是纯debian,这个程序对他不起作用。他告诉我他错过了一些图书馆。所以我想知道:如果我把我正在使用的库(即.So文件)和程序一起发送给他,他能运行它吗? 我运行了lddtree,下面是输出: game => ./game (interpreter => /lib/ld-linux.so.2) libGL.so.1 => /u

我正在ubuntu上编写一个opengl应用程序,它的编译和运行都很好。但是当我把我的程序(是的,是在发布模式下编译的程序)发送给我的朋友,我认为他运行的是纯debian,这个程序对他不起作用。他告诉我他错过了一些图书馆。所以我想知道:如果我把我正在使用的库(即.So文件)和程序一起发送给他,他能运行它吗? 我运行了lddtree,下面是输出:

game => ./game (interpreter => /lib/ld-linux.so.2)
libGL.so.1 => /usr/lib/libGL.so.1
    libnvidia-tls.so.280.13 => /usr/lib/libnvidia-tls.so.280.13
    libnvidia-glcore.so.280.13 => /usr/lib/libnvidia-glcore.so.280.13
    libXext.so.6 => not found
    librt.so.1 => not found
    libdl.so.2 => not found
libX11.so.6 => not found
libXxf86vm.so.1 => not found
libstdc++.so.6 => not found
libm.so.6 => not found
libgcc_s.so.1 => not found
libc.so.6 => not found
libpthread.so.0 => not found
(这是我电脑的输出,不是他的)
谢谢。

很可能您是针对不同的版本进行编译的(例如libc——我保证他有,但可能与您的版本不匹配)

最好的解决方案是只向他发送源代码并让他编译(假设他所要做的就是键入
make


除此之外,您还可以为他的Debian版本交叉编译它,或者静态链接所有内容。但是我不知道如何做这两件事。

这比给他发送二进制文件要复杂一点。您可能需要。

为linux构建可重新分发的二进制文件是完全可行的。它只需要一些额外的工作。以搅拌机为例

Listaller的人创建了一些工具和库来帮助这个过程。我建议你阅读他们的文档

不幸的是,大多数有趣的文档从互联网上消失了(为什么?),但你仍然可以在Wayback机器中找到它们。查找“binreloc”和“Autopackage”

更新 现在,在您的案例中,规范的解决方案是重新构建所有必需的库(独立于发行版二进制文件),并将它们与相关路径链接到。对不起,我不能告诉你我头脑中的细节,因为坦率地说,我不记得他们。我得先把我的笔记再看一遍,可能还要修改一下


如果你在寻找灵感,只需看看Blender是如何做到的。

如果没有
libX11
,你的朋友是如何运行图形化的东西的?他有X11库。输出是我的openGL应用程序使用的库。它怎么说“找不到”很奇怪。如果二进制文件被编译为32位,而你朋友的机器是64位(反之亦然),那么可能值得检查一下。。。如果二进制文件是32位的,您可能只需要安装必要的32位兼容软件包。好的,但以desura上的游戏为例呢?它们运行得很好,可能在许多发行版上运行?对你来说,同样的问题是:像desura这样的应用程序如何,linux游戏需要在许多linux发行版上运行?我不熟悉它们,但我想它们对每个linux发行版都有一个包。开源软件可以使用类似config/make的东西在客户端机器上编译。