Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.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++ 与Microsoft相比,Linux CRunTime库是如何处理的_C++_Linux_Crt - Fatal编程技术网

C++ 与Microsoft相比,Linux CRunTime库是如何处理的

C++ 与Microsoft相比,Linux CRunTime库是如何处理的,c++,linux,crt,C++,Linux,Crt,我对微软的CRT有很多概念上的问题。对于任何项目,您都必须编译所有必需的库,以链接到同一版本的CRT 第一个问题是当您的项目静态链接到CRT(/MT)时。然后,所有依赖库也必须静态链接它们自己的CRT。因此,每个库都有自己的版本-例如-malloc()。如果您去年在系统A上编译了其中一个库,那么该CRT版本可能与您当前在另一个带有service pack 3+的系统B上使用的版本不同。因此,如果释放库分配的对象,可能会遇到问题 因此,动态链接CRT似乎是一条可行之路(/MD)。有了DLL,所有库

我对微软的CRT有很多概念上的问题。对于任何项目,您都必须编译所有必需的库,以链接到同一版本的CRT

第一个问题是当您的项目静态链接到CRT(/MT)时。然后,所有依赖库也必须静态链接它们自己的CRT。因此,每个库都有自己的版本-例如-malloc()。如果您去年在系统A上编译了其中一个库,那么该CRT版本可能与您当前在另一个带有service pack 3+的系统B上使用的版本不同。因此,如果释放库分配的对象,可能会遇到问题

因此,动态链接CRT似乎是一条可行之路(/MD)。有了DLL,所有库都可以在系统上获得当前的CRT实现。除了微软的并行机制之外,情况并非如此。相反,您得到的CRT版本印在您编译的库上,并且该版本的DLL被提供给该库。因此,与我之前描述的完全相同的问题可能会发生。一年前,您在系统a上针对一个CRT编译了一个库。一年后,有了一个升级版。主程序使用一个版本的CRT获取DLL,库使用另一个版本的CRT获取DLL,同样的问题也会发生

那你是做什么的?我意识到跨库内存分配是不受欢迎的。但是你可以忽略malloc的例子,然后想出另一个例子。您是否让每个开发人员重新编译其机器上的每个依赖库,以确保所有内容都使用相同的CRT?那么在这个版本中,你会重新编译每个库吗

这在Linux上是如何工作的?这是我的主要兴趣。是否有随GCC提供的CRT或Linux系统本身附带的CRT库?我从未见过在Makefils中显式链接CRT


在Linux上,动态库链接的对象是什么?在Linux方面,我认为标准库有两个基本部分存在争议:我们有C运行时部分,它应该永远与ABI兼容。实际上,在最后的链接时间,无论哪个版本的链接都应该是好的,并且您可以使用二进制文件重新分发任何需要的共享库,如果它是为了兼容性而需要的旧版本。通常,这些库只是并排放置在*NIX系统上


第二,你有C++库。这些保证几乎不以任何方式兼容ABI,因此必须重建最终二进制的每个组件,以与C++库的相同版本进行重建。不幸的是,没有办法解决这个问题,否则你可能会出现各种各样的不匹配。这就是为什么许多开放源代码库甚至不用预先制作库二进制文件的原因:每个人都需要构建自己的副本,以确保其正确链接到最终的应用程序代码。

据我所知,在Linux中重建所有项目和依赖项通常不是问题,因为代码经常可用。glibc(C库的GNU实现,包括ISO C+POSIX+一些扩展)使用版本符号处理版本之间的兼容性。几乎所有其他库作者都不太关心版本之间的这种兼容性,因为无论如何,大多数Linux软件都是作为源代码分发的,可以随意重新编译(通过分发版,甚至由最终用户重新编译).从技术上讲,由于上述符号版本的原因,在Linux上也可能出现调用不同samefunc@@version的不同代码部分的问题。但是,与msvcrt不同,glibc到目前为止只有一个malloc符号(malloc@@glibc_2.2.5)。我也不明白为什么它需要更多,毕竟,malloc的ABI自ANSI C以来没有改变,而且不太可能在短期内改变。我考虑过简化Linux的情况。程序也不要链接到特定的主要次要libc版本(补丁版本被排除在外,以支持不改变ABI的更新)问题是,Linux平台上的源程序中有更多的软件被构建。同样,适当的库下载也是由包管理器来处理的。CRT和C++ STD库总是动态链接的吗?如果“CRT。SO”。是链接的,路径中的一个会被使用吗?还是有一种类似于Windows的机制,Windows DLL Loader会查看CRT版本的清单并从Windows\WinSxS中获取DLL?这些库并不总是动态链接的,尽管在*NIX中这样做非常流行。它链接类似于
libc.so.1
的内容,其中有一个版本n附加,以便它知道在运行时加载哪个
.so
。@AndréCaron:实际上,程序甚至可以针对特定的符号版本进行链接,一个很好的例子是针对glibc进行链接,glibc有很多版本化的符号。