C++ 可移植共享对象?
是否可以像Windows中的DLL那样以可移植的方式使用共享对象文件 我想知道是否有一种方法可以为Linux提供一个已编译的、随时可用的库。同样,您可以在Windows中编译DLL,并且它可以在任何其他窗口上使用(好的,不是任何其他窗口,但在大多数窗口上都可以) 这在Linux中可能吗 编辑:C++ 可移植共享对象?,c++,linux,portability,shared-objects,shared-libraries,C++,Linux,Portability,Shared Objects,Shared Libraries,是否可以像Windows中的DLL那样以可移植的方式使用共享对象文件 我想知道是否有一种方法可以为Linux提供一个已编译的、随时可用的库。同样,您可以在Windows中编译DLL,并且它可以在任何其他窗口上使用(好的,不是任何其他窗口,但在大多数窗口上都可以) 这在Linux中可能吗 编辑: 我刚刚醒来,读了答案。有一些非常好的。 我不是想隐藏源代码。我只想提供一个已经编译好并可以使用的库,这样没有编译经验的用户就不需要自己动手了。 因此,我们的想法是提供一个能在尽可能多的不同Linux上工作
我刚刚醒来,读了答案。有一些非常好的。
我不是想隐藏源代码。我只想提供一个已经编译好并可以使用的库,这样没有编译经验的用户就不需要自己动手了。
因此,我们的想法是提供一个能在尽可能多的不同Linux上工作的.so文件。
该库是用C++编写的,使用STL和Boost库。 < P>只需将.so文件放入/UR/LIB可以工作,但是您可能会破坏您的发行版用于管理库的方案。 看看linux标准库——这是linux发行版中最接近通用平台的东西
你想实现什么?那么,问题是,如何为Linux开发共享库?你可以看看或者 我知道你在问什么。对于Windows,MSFT已小心地使DLL完全兼容,因此您的DLL通常兼容几乎所有版本的Windows,这就是为什么您称之为“便携式” 不幸的是,在Linux上有太多的变体(每个人都认为“不同”才能赚钱),所以你无法获得与Windows相同的好处,这就是为什么我们有许多相同的包,针对不同的发行版、发行版本、CPU类型等编译而成 有人说问题是由(CPU)体系结构引起的,但事实并非如此。即使在同一拱门上,分布之间仍然存在差异。一旦您真正尝试发布一个二进制软件包,您就会知道这有多困难——即使是C运行时库依赖项也很难维护。Linux操作系统缺少太多东西,所以几乎每个服务都涉及依赖性问题
通常,您只能构建与某些发行版兼容的二进制文件(或者,如果幸运的话,可以构建多个发行版)。这就是为什么以二进制形式发布Linux程序总是会出错的原因,除非绑定到Ubuntu、Debian或RH等发行版。如果你想通过给用户提供编译代码来帮助用户,我知道的最好的方法就是给他们一个静态链接的二进制+文档,说明他们如何运行二进制。(这可能是除了给他们提供源代码之外)大多数静态链接的二进制文件在相同体系结构的大多数Linux发行版上工作(+32位(x86)静态链接的二进制文件在64位(amd64)上工作)。难怪Skype提供了一个静态链接的Linux下载 回到你的图书馆问题。即使您是在Linux上编写共享库的专家,并且您花时间尽量减少依赖性,以便您的共享库能够在不同的Linux发行版(包括旧版本和新版本)上工作,也无法确保它在未来(例如,2年)能够工作。您很可能最终会维护.so文件,即反复进行一些小的修改,使.so文件与较新版本的Linux发行版兼容。这在很长一段时间内都不是一件有趣的事情,它会大大降低您的工作效率:您花在维护库兼容性上的时间本应该花在改进软件的功能、效率、安全性等方面
还请注意,以.so形式提供一个库很容易让用户感到不安,这在他们的系统上不起作用。(而且你没有能力让它在所有的Linux系统上运行,所以这种情况是不可避免的。)你也提供32位和64位,包括x86、PowerPC、ARM等吗。?如果.so文件仅适用于Debian、Ubuntu和Red Hat(因为您没有时间将该文件移植到更多发行版),您很可能会让您的SUSE和Gentoo用户(以及更多用户)感到不安。I高度高度建议使用LSB应用程序/库检查器。如果您:
- 正在使用某些发行版上不可用的扩展
- 在安装脚本中引入bash ISM
- 使用在所有最近的内核中都不可用的系统调用
- 依赖非标准库(它将告诉您哪些发行版缺少它们)
- 还有很多,很多其他非常好的支票