我正在将一些ADA目标文件与一些调用ADA函数的C ++代码链接起来。编译和链接传递没有任何问题,但是当我运行程序时,会发生运行时异常:
undefined symbol: __gnat_rcheck_CE_Invalid_Data
好像我忘了链接一些目标文件了。但是,我将ADA编译器生成的所有.o文件传递给链接器......
有什么想法吗?
干杯
迈克尔
P.S。:我正在开发(Ubuntu)Linux,GNAT 2014,gcc 4.7.4。
答案 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代码编译成(共享)库,就像一个魅力。
感谢大家的建议!