我想将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的链接失败`
1条答案
按热度按时间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()的东西,我在这些文档的相关部分看到了。