Eclipse 是不是必须处理 C++ ABI 兼容性问题?

Posted

技术标签:

【中文标题】Eclipse 是不是必须处理 C++ ABI 兼容性问题?【英文标题】:Does Eclipse have to deal with C++ ABI compatibility issues?Eclipse 是否必须处理 C++ ABI 兼容性问题? 【发布时间】:2012-01-06 17:26:06 【问题描述】:

Eclipse 项目提供installers for Linux。这些安装程序(或已安装的可执行文件)是否包含任何已编译的 C++ 代码?如果是这样,Eclipse 如何避免 C++ ABI 兼容性问题?

我认为 Eclipse 的本地库(如 SWT)必须全部用 C 编写。(我们暂时忽略 Windows。)查看 SWT 的源代码时,我注意到 XPCOM-related code 是用 C 编写的C++。

那么有什么诀窍呢?如果我从安装程序安装 Eclipse,我会得到这些东西吗?如果是这样,无论我的机器上使用哪个 C++ 运行时,它都能正常工作吗?如果是,“他们”是怎么做到的?

(抢先解决花生画廊:我意识到我可以只使用包管理器来安装 Eclipse。我问的是程序不是专门为我的机器量身定制的情况。)

我注意到SWT FAQ explains,“SWT 使用 JNI 与操作系统中的本机小部件进行交互。必须针对感兴趣的窗口系统、操作系统和硬件架构编译 SWT JNI 库。”

这让我想,“那么 Eclipse 如何能够为 Linux 制作一个万能的安装程序?” (也许如果我只是尝试使用其中一种安装程序,一切都会变得清晰。但有时最好问问你的好手。)

我试图了解使用 JNI 的 Java 项目如何处理 C++ ABI 兼容性问题。几天前我问了一个类似的问题,但还没有听到太多消息(Is the Java Native Interface (JNI) affected by C++ ABI compatibility issues?)。我想 Eclipse 专家可能会给我一些指导,因为 Eclipse 可能必须处理类似的问题。

要明确一点:Java 进程似乎基本上不能使用 C++ 库。 Java 进程需要 C++ 运行时。如果一个共享库需要一个不兼容的 C++ 运行时......好吧,你现在可能明白了。

(感谢您阅读所有这些内容。)

【问题讨论】:

C++ ABI 在 Windows 上也是一场噩梦(不同版本的 MSVC,加上调试与发布问题,加上像迭代器调试这样的奇怪标志)。运行时版本也是如此。 亚历山大:好点子。我将更改“让我们暂时忽略 Windows,因为 C++ ABI 兼容性在该平台上不是问题。”简单地说“让我们暂时忽略 Windows。” 可能每个人都以相同的方式使 c++ 可移植:extern "C" 用于每个导出的函数? Afaik 无论如何你都不能从 JNI 调用 c++ 函数(我会说正是出于 ABI 的原因,但谁知道)所以你得到了它作为已经使用 C 函数的副作用。 【参考方案1】:

我的猜测是,当他们构建它时,他们将 c++ 标准库静态链接到应用程序(或在安装程序期间提供他们自己的动态库副本)然后 glibc 是唯一的其他动态库,这更容易处理with(尽管仍然存在与之相关的挑战)。

您可以对此进行测试的一种方法是安装包(在 linux 上),然后针对可执行文件运行 ldd 实用程序并查看它链接的内容。

【讨论】:

以上是关于Eclipse 是不是必须处理 C++ ABI 兼容性问题?的主要内容,如果未能解决你的问题,请参考以下文章

通过 void 指针通过 C ABI 传递 C++ 对象(可能具有多重虚拟继承)

C ++中的安全交叉编译器ABI?

C++学习(四二零)如何查看手机的架构abi

Linux 上的 C++ 插件 ABI 问题

c++ 项目仍然需要 -D_GLIBCXX_USE_CXX11_ABI=0

在 ABI 级别的 Visual Studio 中使用 C++ 重新实现 DLL 方法变量