我正在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)
答案 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。