Linux:C / C ++标准库静态与dynamic链接

可能在任何操作系统上都可以静态或dynamic地编译C ++ / C标准库。 在Windows上,我总是倾向于使用静态构build,因为它有助于避免安装或未安装在特定的Windows版本,版本和Service Pack等上的不同版本的库的“地狱”问题。静态链接使软件更具可移植性,更less依赖于最终用户使用他的操作系统(我甚至看到了一些例子,当最终用户可以在系统system32一些DLL上做SHIFT+DEL时,他不能解释为什么,或者当用户声称我的应用程序包含病毒,因为它试图dynamic下载链接的先决条件从官方的微软网站…)因此,在Windows上静态链接通常比我的经验dynamic更好。 但是,我是Linux新手,所以任何人都可以分享他的经验? 我的问题是: 如果我们忽略了dynamic的可以节省内存和硬盘空间的事实,并且如果我们打算用自动安装程序 (硬盘空间和内存现在已经够便宜了,所以没有理由牺牲几个小时的工作时间来创build真正的便携式安装程序来赢得一些MB或者硬盘空间)。 有dynamic/静态链接的任何Linux特定的问题?

在Linux上,通常有一个软件包管理器,可以确保只安装一个版本的库。 所以通常没有地狱,没有动态链接的问题。 动态链接是Linux上的标准方式。

我想说的答案取决于你如何分发软件。

如果您将软件打包为特定的Linux发行版,则通常首选动态链接版本。 您知道在系统上找到哪些库,您可以指定依赖关系。

然而,如果你想把这个软件作为一个运行在“任何”系统上的Linux二进制文件(比如各种游戏或者像Matlab这样的软件)来分发,那么你将最终得到和Windows一样的dll(或者.so)地狱问题。 您不知道系统上哪些库的版本。 因此,你将不得不提供你自己的.so文件或链接静态。

使用动态链接看整点是为了减少可执行文件的大小和内存使用量。如果你忽略了,那就太少说了。

另一方面你提到关于节省内存和磁盘空间。有必要节省磁盘空间,因为当你想导出你的应用程序/程序,你不能把2Gb应用程序在互联网上下载(例如openCV库是约2.1GB)。 解决方案是动态链接它们,只加载那些对你来说是必要的模块。这使高效的多任务也可以(只产生一个模块副本,整个程序使用相同的副本)。 独有的:

例如,媒体播放器应用程序最初可能附带支持mp3文件格式的编解码器。 如果媒体播放器是静态链接的,则不能动态更新它来支持不同的文件格式,而不需要替换整个应用程序。 动态链接意味着包含更新的编解码器(包括一些增强和错误修复)的共享库的新版本可以由动态链接器在运行时动态加载到内存中以替换原始共享库。 共享库也可以被多个应用程序共享。 例如,两个不同的媒体播放器都可以使用包含相同编解码器的相同共享库。 这可能意味着运行应用程序的设备需要较少的物理内存,具体取决于动态链接程序的大小。

第三,在Linux中,除了/bin/ash.static之外,一切都是动态链接的,也有它的动态版本/ bin / ash,但是这不应该阻止你在linux中静态链接。 当使用gcc链接是默认动态。我想你应该使用“静态”标志来静态链接库

@Vitaliy你提到了这一点。这里需要注意的是,智能链接和共享(或动态)库的创建是相互排斥的,也就是说,如果你打开智能链接,那么创建共享库就是转过身来。

智能链接将代码分解成小代码块,并且加载它们的依赖关系。 所以如果你多次调用一个依赖项,它会被多次加载。 这给了一个非常好的执行时间,但是编译时间非常长,特别是对于大型单元来说,所以有一定的权衡。