在其他系统上找不到共享库

时间:2018-08-30 20:52:28

标签: c++

我正在ubuntu上编译游戏(已安装liblaries glfw glew sfml),并且游戏正常运行,但是当我将可执行文件复制到其他ubuntu机器并尝试运行它时,却出现错误:

    libsfml-audio.so.2.4 => not found
    libGLEW.so.2.0 => not found
    libglfw.so.3 => not found

为什么? (我正在使用code :: blocks和gnu gcc编译器,ubuntu 18.04)

2 个答案:

答案 0 :(得分:1)

您正在动态链接到您使用的库。这意味着在编译程序时,编译器不会将您调用的glfw,glew或sfml函数的代码插入二进制文件中。而是在运行程序时在适当的动态库中查找这些功能。

这意味着必须在运行程序的计算机上安装动态库“ libsfml-audio.so.2.4”,“ libGLEW.so.2.0”和“ libglfw.so.3”。以及在其上编译程序的计算机。

如果您不想在计算机上安装要使用的库,请在该计算机上运行该程序,或者在该计算机上不可用这些库,则需要静态链接这些库。这样,编译器会将您调用的库函数的所有代码复制到二进制文件中,并且可以在没有动态库的情况下运行。这会在某种程度上增加二进制文件的大小,并且某些库(例如GNU C标准库)要么无法静态链接,要么无法正常运行。因此,通常最好在希望其能够运行的最旧发行版上构建程序。

或者,您可以将程序作为源代码分发,并让用户自己为系统编译它。

答案 1 :(得分:0)

您的可执行文件在通过“共享库”或.so文件启动时会加载外部代码。它们可以存在于系统中的任何位置,并使用各种路径规则进行加载。 (Windows相当于dll)

ldd是一个Unix实用程序,向您显示这些依赖项。

如果存在静态(.a)版本,一种选择可能是将这些库直接编译到您的代码中。

另一个只是将它们捆绑在一起。默认的加载规则是在探索路径IIRC之前在当前目录中检查.so。