Reputation: 21
I want to integrate my Ada static library (libnewapi.a) with my C source code (main.c). I do not have any issues generating the static library but when trying to link it with main.c. I get the below link error, libnewapi.a(unit1.o):unit1.adb:(.text+0x31): undefined reference to `__gnat_rcheck_CE_Overflow_Check' I am not using this reference in my main.c not in any of my Ada files. I do not know why this reference was added automatically. It is crucial that I need to link my main.c using a static Ada library for my project. I do not know where I am going wrong. Help is much appreciated. Thanks!
I am generating libnewapi.a using a GPR as below,
-- 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 Sourcefiles:
-- 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 Source File:
/* 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;
}
I am using the below GPR to link the above main.c with the Ada static library generated using ada_gen_a.gpr.
-- 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;
When I try to build the Ada_Use_A.gpr GPS I get the below linker error,
libnewapi.a(unit1.o):unit1.adb:(.text+0x31): undefined reference to
__gnat_rcheck_CE_Overflow_Check'
gprbuild: link of main.c failed`
Upvotes: 1
Views: 200
Reputation: 44804
In general, all but the most trivial of Ada routines are going to require some support from the internal Ada runtime library. __gnat_rcheck_CE_Overflow_Check
certainly sounds like one of those. (My SWAG for an English translation of that is "Gnat Runtime check for constraint_error exceptions on an object going out of the defined bounds of its subtype").
If your main program is in Ada, then you get the RTL linked in automatically, along with startup elaboration code generated for any packages that may need it, and shutdown cleanup code. If your main program is in some other language, then you usually will need to link those in manually, and find a way to call elaboration manually before your Ada routine is called.
Getting any more specific involves the details of linking and running in a mixed-language environment, which is (last I checked) not entirely language-defined. You did specify your compiler, but it might also be helpful if you were to specify what platform you are trying this on.
For example, for Windows with Gnat, the relevant documentation is the section on Mixed-Language Programming Under Windows, from the Gnat User's Guide.
One thing I'm noticing in particular is that I don't see anything in your C main that looks like its making the calls to adainit() and adafinal() I see in the relevant section of those docs.
Upvotes: 1