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

时间:2014-10-02 11:30:29

标签: c++ linux linker ada

我正在将一些ADA目标文件与一些调用ADA函数的C ++代码链接起来。编译和链接传递没有任何问题,但是当我运行程序时,会发生运行时异常:

undefined symbol: __gnat_rcheck_CE_Invalid_Data

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

有什么想法吗?

干杯

迈克尔

P.S。:我正在开发(Ubuntu)Linux,GNAT 2014,gcc 4.7.4。

2 个答案:

答案 0 :(得分:4)

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

(假设主程序是用C ++编写的)

如果没有,请参阅this simple example如何将两者合并。

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

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

答案 1 :(得分:0)

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

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

最终我遵循了Simon Wright的建议并将我的ADA代码编译成(共享)库,就像一个魅力。

感谢大家的建议!