未定义符号:__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”