未定义符号:__gnat_rcheck_CE_Invalid_Data 将 ADA 与 C++ 链接时

Posted

技术标签:

【中文标题】未定义符号:__gnat_rcheck_CE_Invalid_Data 将 ADA 与 C++ 链接时【英文标题】:undefined symbol: __gnat_rcheck_CE_Invalid_Data when linking ADA with C++ 【发布时间】:2014-10-02 11:30:28 【问题描述】:

我正在将一些 ADA 对象文件与一些调用 ADA 函数的 C++ 代码链接。编译和链接通过没有任何问题,但是当我运行程序时,出现运行时异常:

undefined symbol: __gnat_rcheck_CE_Invalid_Data

好像我忘了链接某个目标文件。但是,我将 ADA 编译器生成的所有 .o 文件传递​​给链接器...

有什么想法吗?

干杯

迈克尔

P.S.:我正在 (Ubuntu) Linux、GNAT 2014、gcc 4.7.4 上进行开发。

【问题讨论】:

如果您没有链接,您将无法运行您的程序?您的意思是您在链接阶段看到此错误? 链接作品,我已经编辑了原帖。 您可以尝试将 Ada 代码构建为库,如 this answer。 我构建了一个(静态)库(顺便感谢您的出色解释!)但是,现在我在执行我的 C++ 程序时得到undefined symbol: system__pool_global__global_pool_object。有什么想法吗? 我刚刚看到您的评论,因为 SO 只会在 my 问题或答案中通知我有关 cmets 的信息,除非评论中包含“@my-name”。希望你已经解决了(也许是通过构建一个动态库) 【参考方案1】:

您是否在调用任何 Ada 功能之前初始化 Ada RTS?

(假设主程序是C++)

如果没有,请参阅this simple example 了解如何将两者结合起来。

本质上,您的 C++ 主程序必须调用 adainit() 作为其初始化的一部分,以启动 Ada 运行时系统,在调用任何 Ada 代码之前,然后它应该在退出之前调用 adafinal(),以便 Ada RTS 可以干净地关闭(例如完成对象、释放存储、终止任务等)

在实践中,我发现在 Ada 中编写 main 并在必要的 C/C++ .o 文件和库中链接更容易。 Ada 会自动跟踪它自己的依赖关系,因此您只需明确告诉 gnatmake(或 gprbuild)有关 C/C++ 部分的信息。

【讨论】:

是的,我正在打电话给adainit()adafinal()。我已经使用 gprbuild 成功地将相同的 Ada 代码与一个简单的 C++ 程序(仅包含一个目标文件)链接起来。现在我想将这段 Ada 代码与一个更大的 C++ 程序链接,该程序有一个复杂的 Makefile(因此,我认为在 C++ 中拥有 main 函数可能更容易)。 第二个想法是......您始终使用相同的编译器版本?也就是说,您使用的是 GNAT2014 中的 gcc,而不是不同安装的位?在 Debian 上,我将 gcc-4.9 和 gnat-4.9 一起使用,但它们可能还没有进入 Ubuntu。【参考方案2】:

我已经解决了这个问题。原因是我编译C++程序的时候没有链接gnat-2014库。

致所有其他新手:将-lgnat-2014 -L<directory_to_libgnat-2014.so> 添加到 gcc 选项中。

最终我听从了 Simon Wright 的建议,将我的 ADA 代码编译到了一个(共享)库中,效果非常好。

感谢大家的建议!

【讨论】:

以上是关于未定义符号:__gnat_rcheck_CE_Invalid_Data 将 ADA 与 C++ 链接时的主要内容,如果未能解决你的问题,请参考以下文章

链接上未定义的符号 ___gxx_personality_v0

架构 i386 的未定义符号:“_OBJC_CLASS_$_RCTBundleURLProvider”

未定义符号:__atomic_exchange_8

架构 x86_64 / i386 的未定义符号

架构 armv7 的未定义符号:“_OBJC_CLASS_$_FIRApp”

Cordova - 架构 x86_64 的未定义符号