Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 可移植共享对象?_C++_Linux_Portability_Shared Objects_Shared Libraries - Fatal编程技术网

C++ 可移植共享对象?

C++ 可移植共享对象?,c++,linux,portability,shared-objects,shared-libraries,C++,Linux,Portability,Shared Objects,Shared Libraries,是否可以像Windows中的DLL那样以可移植的方式使用共享对象文件 我想知道是否有一种方法可以为Linux提供一个已编译的、随时可用的库。同样,您可以在Windows中编译DLL,并且它可以在任何其他窗口上使用(好的,不是任何其他窗口,但在大多数窗口上都可以) 这在Linux中可能吗 编辑: 我刚刚醒来,读了答案。有一些非常好的。 我不是想隐藏源代码。我只想提供一个已经编译好并可以使用的库,这样没有编译经验的用户就不需要自己动手了。 因此,我们的想法是提供一个能在尽可能多的不同Linux上工作

是否可以像Windows中的DLL那样以可移植的方式使用共享对象文件

我想知道是否有一种方法可以为Linux提供一个已编译的、随时可用的库。同样,您可以在Windows中编译DLL,并且它可以在任何其他窗口上使用(好的,不是任何其他窗口,但在大多数窗口上都可以)

这在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
  • 使用在所有最近的内核中都不可用的系统调用
  • 依赖非标准库(它将告诉您哪些发行版缺少它们)
  • 还有很多,很多其他非常好的支票
您可以获取和下载该工具。它很容易跑。。只需卸载它,运行一个perl脚本并将浏览器指向localhost。。其余部分由浏览器驱动

使用该工具,您可以轻松获得库/应用程序LSB认证(两个版本),并使发行版打包程序的工作更轻松

除此之外,只需使用libtool(或类似工具)来确保您的库安装正确,为不想链接DSO的人提供一个静态对象(您的库在大多数发行版中出现需要时间,因此编写一个可移植程序,我不能指望它会出现)并且很好地评论你的公共界面

对于图书馆来说,我发现这是最好的。文档非常重要,它肯定会影响我选择用于任何给定任务的库

真的,再一次,检查应用程序检查器,它会给你的可移植性问题报告,这将需要一年的图书馆在野外获得否则

最后,试着让你的库很容易地放在树上,这样我就不必静态地链接它了。正如我所说,它可能需要几年时间才能在大多数发行版中变得普遍。对我来说,只要抓取你的代码,把它放在src/lib中并使用它就容易多了,直到你的库变得通用为止。请,请。。给我单元测试,(测试任何东西