分发一份C++;Linux上的应用程序(游戏):共享库还是静态库? 我有一个C++游戏/应用程序,使用了几个库:OpenGL、OpenAL、CURL、FRIETYPE2、GLFW等。 我应该使用共享库在Linux上分配我的C++二进制应用程序吗?还是应该静态链接? 静态库:让我的应用程序在大多数Linux发行版上运行似乎是一个很好的解决方案。实际上,我的应用程序不依赖于系统上安装的库版本。不幸的是,执行此静态链接似乎相当痛苦,因为大多数库在默认情况下不提供静态库文件(*.a)。因此,我有一种感觉,那不是一种常见的做法。然而,我检查了GOG.com发布的几个游戏,我检查的所有游戏都不依赖于共享库(使用lddtree检查) >强共享库< /强>:它似乎是推荐的解决方案,但是我的C++应用程序几乎不可能与所有Linux发行版兼容。我应该为Ubuntu 16.04构建一个特定的二进制文件,然后为Ubuntu 20.04构建另一个二进制文件,等等。。。对于单个开发人员来说,这似乎非常耗时

分发一份C++;Linux上的应用程序(游戏):共享库还是静态库? 我有一个C++游戏/应用程序,使用了几个库:OpenGL、OpenAL、CURL、FRIETYPE2、GLFW等。 我应该使用共享库在Linux上分配我的C++二进制应用程序吗?还是应该静态链接? 静态库:让我的应用程序在大多数Linux发行版上运行似乎是一个很好的解决方案。实际上,我的应用程序不依赖于系统上安装的库版本。不幸的是,执行此静态链接似乎相当痛苦,因为大多数库在默认情况下不提供静态库文件(*.a)。因此,我有一种感觉,那不是一种常见的做法。然而,我检查了GOG.com发布的几个游戏,我检查的所有游戏都不依赖于共享库(使用lddtree检查) >强共享库< /强>:它似乎是推荐的解决方案,但是我的C++应用程序几乎不可能与所有Linux发行版兼容。我应该为Ubuntu 16.04构建一个特定的二进制文件,然后为Ubuntu 20.04构建另一个二进制文件,等等。。。对于单个开发人员来说,这似乎非常耗时,c++,shared-libraries,static-libraries,C++,Shared Libraries,Static Libraries,我错过什么了吗? 注意:在Windows上,它更简单:我可以使用共享库(*.dll)并将它们与我的应用程序一起提供。在Linux上,似乎很难提供共享库。示例:“libcurl-gnutls.so.4”依赖于超过20个其他共享库:Windows上的情况并非如此,它的“libcurl-x64.dll”是自给自足的。在分析了几十个视频游戏之后,我终于回答了自己的问题。主要有两类: 仅使用静态库构建的游戏。大多数时候,它似乎与使用虚幻引擎的游戏有关 使用游戏附带的共享库构建的游戏。游戏通过bash脚本

我错过什么了吗?
注意:在Windows上,它更简单:我可以使用共享库(*.dll)并将它们与我的应用程序一起提供。在Linux上,似乎很难提供共享库。示例:“libcurl-gnutls.so.4”依赖于超过20个其他共享库:Windows上的情况并非如此,它的“libcurl-x64.dll”是自给自足的。

在分析了几十个视频游戏之后,我终于回答了自己的问题。主要有两类:

  • 仅使用静态库构建的游戏。大多数时候,它似乎与使用虚幻引擎的游戏有关

  • 使用游戏附带的共享库构建的游戏。游戏通过bash脚本启动,并使用LD_LIBRARY_PATH定义这些共享库的路径。对我来说似乎是最好的解决方案,即使它不是共享库的精神

  • 旁注:

    • 通过Linux发行版的主要版本包(RPM、DEB等)分发的游戏已经存在,但非常罕见
    • 也有一些游戏使用动态库,这些库没有随游戏一起发布,但只有60%的游戏能够在我的Linux发行版上启动
    • 我还没有看过使用Snap/Flatpak/AppImage的游戏

    我不明白为什么C++共享库必然与不同的Ubutu版本不兼容,或者为什么它需要求助于LD-RealApple路径。共享库的不同版本(版本号)可以在系统中共存,并且程序加载器能够基于二进制注释的ELF元数据搜索正确的版本。此外,出于这个目的,GNU/Linux共享对象相当于Windows DLL。如果您的代码是可移植的,您甚至可以使用MinGW从同一源文件构建.so和.dll对象(GNU build system,又称Autotools,可能会有很大的帮助)。

    如果您为Ubuntu 16.04构建二进制文件,它几乎肯定会与Ubuntu的更高版本兼容(在某些情况下,最终用户可能需要安装一些兼容软件包)。此二进制文件不一定与RedHat发行版兼容,但它可能是兼容的。如果您针对RedHat版本进行测试并通过测试,它几乎肯定会在以后的RedHat版本中运行。