c++ - 在其他系统上找不到共享库
问题描述
我正在 ubuntu 上编译游戏(安装了库 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)
解决方案
您正在动态链接到您使用的库。这意味着当您编译程序时,编译器不会将您调用的 glfw、glew 或 sfml 函数的代码插入到二进制文件中。相反,当您运行程序时,将在适当的动态库中查找这些函数。
这意味着动态库“libsfml-audio.so.2.4”、“libGLEW.so.2.0”和“libglfw.so.3”必须安装在运行程序的计算机上以及编译程序的计算机。
如果您不想在运行程序的计算机上安装您使用的库,或者它们在该计算机上不可用,那么您需要静态链接这些库。这样,编译器会将您调用的库函数的所有代码复制到二进制文件中,并且它可以在没有动态库的情况下运行。这将在一定程度上增加二进制文件的大小,并且某些库(如 GNU C 标准库)要么无法静态链接,要么无法正常工作。出于这个原因,在您希望它能够运行的最旧的发行版上构建您的程序通常是一个好主意。
或者,您可以将您的程序作为源代码分发,并让用户自己为他们的系统编译它。
推荐阅读
- javascript - 解析 json 字符串,其中数字有逗号而不是点
- tsql - 在 dbContext.Entity.FromSqlRaw() 中使用 CTE
- kubernetes - Kubernetes 成功显示 Cron 作业,但未获得所需结果
- flutter - 颤振下拉菜单
不是“字符串”类型的子类型 - python - Python SMTP 更改名称(欺骗)
- r - 按列元素聚合数据框行时保留相应的行名
- ssl - Kafka Spout SSL 风暴
- class - 如何在飞镖或颤振中正确创建一个类
- reactjs - 部署阶段出错。在 AWS 代码管道的日志中未发现错误
- kotlin - 仅当 Kotlin Flow 的排放量在给定时间内保持不变时,使 Kotlin Flow 排放量的运营商链是什么?