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++ 对象(可能具有多重虚拟继承)