【发布时间】:2013-06-07 06:57:13
【问题描述】:
我下载了一个带有大量静态和动态库的 Linux C SDK。自述文件是这样说的:
此 SDK 使用 gcc 版本 4.5.1 编译。
您不应将此 SDK 二进制文件与其他 gcc 版本混合,因为 您的应用程序最终将加载两个不同的 libcs,它们 导致两个不同的堆。混合堆会导致应用 崩溃,当试图释放由另一个分配的内存时 堆。
我从未听说过这样的事情,并且在网络上进行搜索也没有得到任何确认。我确实找到了关于 ABI 的东西,但据我了解,这只是意味着这些库可能与我的 GCC 版本不兼容,因为它们根本不运行。这与 libc 版本或堆无关。
那么,自述文件所说的是真的吗?或者,更笼统地说:我是否应该永远不要尝试使用我从 Internet 下载的库与另一个 GCC 版本而不是编译它们的版本? 如果我想使用多个使用不同 GCC 版本编译的库怎么办?
谢谢大家, 莫里茨
【问题讨论】:
-
我没有听说过类似的事情。我可能会删除 SDK,然后去找一个不会带来麻烦的 SDK。
-
我已经运行了使用不同 libc 和 gcc 版本编译的代码,没有问题。不过,它可能与该库和特定版本的 GCC 相关。自述文件声称它特定于释放内存,因此它通常可能不是问题,因为幸运的是分配内存的同一个堆释放了它,并且他们试图让您免于罕见但难以追踪的错误。
-
可能是这些 SDK 之一强制使用它们随编译器套件提供的特定 libc。就像嵌入式系统的 SDK,它会自动链接 uclibc 或 Dietlibc。
-
SDK 的供应商似乎很困惑,C 库是独立于 GCC 的,所以如果他们担心混合 C 库,那么它与 GCC 4.5.1 编译在很大程度上无关紧要,也许正如 fork0 所暗示的那样,他们的意思是它是用特定的 C 库编译的,而使用不同的 C 库(例如 GNU libc)可能是个问题……但在这种情况下,仅说明它是用 GCC 4.5.1 编译的,是非常没用的。