无法将C源代码与Ada静态库链接(错误:libnewapi.a(unit1.o):unit1.adb:undefined reference to `__gnat_rcheck_CE_Overflow_Check')

bkkx9g8r  于 2023-08-03  发布在  其他
关注(0)|答案(1)|浏览(73)

我想将Ada静态库(libnewapi.a)与C源代码(main.c)集成。我在生成静态库时没有遇到任何问题,但在尝试将其与main. c链接时遇到了问题。我得到以下链接错误,libnewapi.a(unit1.o):unit1.adb:(.text+0x31):`__gnat_rcheck_CE_Overflow_Check'的未定义引用我没有在我的main.c中使用这个引用,也没有在任何Ada文件中使用。我不知道为什么这个引用被自动添加。我需要使用静态Ada库为我的项目链接我的main. c,这一点至关重要。我不知道我错在哪里。非常感谢您的帮助。谢谢你,谢谢
我使用下面的GPR生成libnewapi. a,

-- ada_gen_a.gpr
    project ada_gen_a is
       for Languages use ("Ada");
       for Source_Dirs use ("./");
       for Library_Name use "newapi";
       for Library_Dir use "./Lib/";
       for Library_Kind use "static";

       package Naming is
          for Spec_Suffix ("ada") use ".ads";
          for Body_Suffix ("ada") use ".adb";
          for Separate_Suffix use ".adb";
          for Dot_Replacement use ".";
          for Casing use "mixedcase";
       end Naming;

       Ada_Switches := ("-gnato", "-O2");

       package Compiler is
          for Default_Switches ("ada") use Ada_Switches;
       end Compiler;

       package Binder is
          for Default_Switches ("Ada") use ("-n","-Lada");
       end Binder;
    end ada_gen_a;

字符串
Ada源文件:

--  unit1.ads
    package Unit1 is
       function Add (A, B : Integer) return Integer;
       pragma Export (C, Add, "ada_add");
    end Unit1;
-- unit1.adb
    package body Unit1 is
       function Add (A, B : Integer) return Integer is
       begin
          return A + B;
       end Add;
    end Unit1;

的数据
C源文件:

/* main.c */
    #include <stdio.h>
    extern void ada_add (void);
    int main (int argc, char *argv[])
    {
       int a = 21, b = 7, c = 0;
       printf ("%d", a);
       printf ("%d", b);
       c = ada_add(a,b);
       printf ("%d", c);
       return 0;
    }


我使用下面的GPR将上面的main. c与使用ada_gen_a. gpr生成的Ada静态库链接起来。

-- Ada_Use_A.gpr
    with "newapi.gpr";
    project Ada_Use_A is

       for Languages use ("C");
       for Source_Dirs use (".");
       for Source_Files use ("main.c");

       package Naming is
          for Casing use "mixedcase";
       end Naming;

       Ada_Switches := ("-gnato", "-O2");

       package Compiler is
          for Default_Switches ("C") use ("-O2", "-Wall");
          for Default_Switches ("Ada") use Ada_Switches;
       end Compiler;

       package Binder is
          for Default_Switches ("Ada") use ("-n","-Lada");
       end Binder;

       for Main use ("main.c");

    end Ada_Use_A;
-- newapi.gpr
    project newapi is
       for Externally_Built use "true";
       for Source_Files use ();
       for Library_Dir use ".\lib\";
       for Library_Name use "newapi";
       for Library_Kind use "static";
    end newapi;

的字符串
当我尝试构建Ada_Use_A.gpr GPS时,我得到以下链接器错误,libnewapi.a(unit1.o):unit1.adb:(.text+0x31): undefined reference to __gnat_rcheck_CE_Overflow_Check' gprbuild:main.c的链接失败`

xxls0lw8

xxls0lw81#

一般来说,除了最普通的Ada例程之外,所有的Ada例程都需要内部Ada运行时库的支持。__gnat_rcheck_CE_Overflow_Check听起来很像其中之一。(我的SWAG的英文翻译是“Gnat Runtime check for constraint_error exceptions on an object going out of defined bounds of its subtype”)。
如果你的主程序在Ada中,那么你会自动得到RTL链接,沿着为任何可能需要它的包生成的启动细化代码,以及关闭清理代码。如果你的主程序是用其他语言编写的,那么你通常需要手动链接这些程序,并在调用Ada例程之前找到一种手动调用细化的方法。
更具体的内容涉及到在混合语言环境中链接和运行的细节,而混合语言环境(上次我检查过)并不完全是语言定义的。您确实指定了编译器,但如果您指定要在哪个平台上尝试此操作,可能也会有所帮助。
例如,对于使用Gnat的Windows,相关文档是Gnat用户指南中关于Windows下的混合语言编程的部分。
我特别注意到的一件事是,我在你的C main中没有看到任何看起来像是调用adainit()和adafinal()的东西,我在这些文档的相关部分看到了。

相关问题