Linker 如何使用gnatmake或Ada代码将Ada库链接到.adb文件

Linker 如何使用gnatmake或Ada代码将Ada库链接到.adb文件,linker,shared-libraries,ada,Linker,Shared Libraries,Ada,我正在使用PLplot运行测试代码,如下所示: 带PLplot_辅助,PLplot_标准; 使用PLplot_辅助,PLplot_标准; 程序xstandard00a为 x、 y:实_向量(0..100); x_Min,y_Min:长浮点数=0.0; x_Max:Long_Float:=1.0; y_Max:长浮点数:=100.0; 开始 --准备要绘制的数据。 对于x'range循环中的i x(i):=长浮点数(i)/长浮点数(x'长度-1); y(i):=y_Max*x(i)**2; 端环;

我正在使用PLplot运行测试代码,如下所示:

带PLplot_辅助,PLplot_标准;
使用PLplot_辅助,PLplot_标准;
程序xstandard00a为
x、 y:实_向量(0..100);
x_Min,y_Min:长浮点数=0.0;
x_Max:Long_Float:=1.0;
y_Max:长浮点数:=100.0;
开始
--准备要绘制的数据。
对于x'range循环中的i
x(i):=长浮点数(i)/长浮点数(x'长度-1);
y(i):=y_Max*x(i)**2;
端环;
--分析和处理命令行参数。
Parse_命令行参数(Parse_Full);
--初始化plplot。
初始化plu图;
--创建一个带标签的框以保存打印。
设置_环境(x_最小、x_最大、y_最小、y_最大、,
对齐=>未对齐,
轴\样式=>线性\框\加);
写标签
(X_标签=>“X”,
Y#U标签=>“Y=100 x#u2#d”,
Title_Label=>“二维线图的简单PLplot演示”);
--绘制上面准备的数据。
绘制_曲线(x,y);
--关闭PLplot库。
结束图;
结束XS标准00A;
它不使用命令
gnatmake“%e”
在geany中构建,也不使用命令
gcc-Wall-c“%f”
进行编译

它给了我一个错误:

 xstandard00a.adb:20:05: file "plplot_auxiliary.ads" not found
 xstandard00a.adb:21:05: file "plplot_standard.ads" not found
显然,我必须链接到图书馆。PLplot的
*.ali
文件位于
/usr/lib64/ada/adalib/plplotada

如何链接build命令
gnatmake
,或者如何在
xstandard00a.adb
中添加额外的代码以查找那些plplplot库
*.ali

更新: 我运行了示例提供的Make文件(xstandard00a.adb),并成功编译了它。我打开make文件以查看它用于编译的标志。我准确地放置了这些标志,并重新编译了另一个类似于xstanrd00a.adb的示例,但它找不到库。显然,除了gnat make使用的旗帜之外,还有其他东西。我错过了一些东西。Make文件编写如下:, SHELL=/bin/bash GNAT_EXECUTABLE_BUILDER=/usr/bin/gnatmake
“-aI/usr/share/ada/adainclude/plplplotada”“-aL/usr/lib64/ada/adalib/plplplotada” EXEXT=

PKG_CONFIG_ENV=PKG_CONFIG_PATH=“/usr/lib64/pkgconfig::/usr/lib64/pkgconfig:/usr/share/pkgconfig”
安装\u tree\u ada\u RPATHCMD=
可执行文件列表=\
XT传统00A$(EXEXT)
全部:$(可执行文件列表)
清洁:
rm-f$(可执行文件列表)*.ali*.o
#目标链接库(plpllotada plplplot)
#由于gnatmake的命令行限制,无法继续(通过拖尾\)
#下面是汽车后的任何东西。
.adb$(EXEXEXT):
$(GNAT_可执行文件_生成器)$<\
-cargs$(shell$(PKG\u CONFIG\u ENV)PKG CONFIG--cflags plplplplot ada plplplplot)-largs$(install\u tree\u ada\u RPATHCMD)$(shell$(PKG\u CONFIG\u ENV)PKG-CONFIG--libs plplplplplplot ada plplplplplplplplot)
.后缀:.adb$(EXEXT)
我在编译/链接库中缺少什么?我尝试了使用gnatmake-P的探地雷达方法,但仍然无法链接。到目前为止,唯一适合我的方法是makefile。然而,我想手动编译来弄清楚这个东西是如何工作的。我在Geany IDE的build命令中写的是:

gnatmake“%e”-aI/usr/share/ada/ada/adainclude/plplotada-aL/usr/lib64/ada/adalib/plplotada


“%e”指IDE中的任何adb文件,在我的例子中是simpleplot.adb,它基本上是xstandard00a.adb

在源代码旁边添加一个.gpr文件,例如,这个文件称为xstandard.gpr:

with "/usr/share/gpr/plplotada.gpr";

project XStandard is
   for Create_Missing_Dirs use "True";
   for Source_Dirs use (".");
   for Object_Dir use "obj";
   package Builder is
      for Executable ("xstandard00a.adb") use "xstandard";
   end Builder;
end XStandard;
(已编辑;我在这个示例项目的源代码中添加了“/usr/share/ada/adainclude/plpllotada”,但最好使用提供的包.gpr文件)

然后执行
gprbuild
。我已经测试了这个,它可以与您给定的源文件一起工作

我通过首先安装plplotada,然后列出我的系统上安装的所有文件包,找到了要包含的gprfile:

sudo apt install libplplotada[Tab]
dpkg-query -L libplplotada2-dev
我的解决方案:

我正在为那些面临同样问题的人提供解决方案

要构建使用plplot库的
myfile.adb
,请编写以下命令:

gnatmake myfile.adb -aI/usr/share/ada/adainclude/plplotada -aL/usr/lib64/ada/adalib/plplotada -cargs -I/usr/include/plplot -largs -lplplotada -lplplot
-I/usr/share/ada/adainclude/plplotada -I/usr/include/plplot myfile.adb
要编译使用绘图库的
myfile.adb
,请编写以下命令:

gnatmake myfile.adb -aI/usr/share/ada/adainclude/plplotada -aL/usr/lib64/ada/adalib/plplotada -cargs -I/usr/include/plplot -largs -lplplotada -lplplot
-I/usr/share/ada/adainclude/plplotada -I/usr/include/plplot myfile.adb

编译之前,请检查库是否如上图所示。它适用于linux系统。请注意,上面的标志很长。如果可能的话,将所有这些标志包含在
myfile.adb
中会很好。

但是,如果您真的想要一个gnatmake答案,我希望其他人能够提供。我不知道,因为我从来没用过。我看到它也有,所以有三种方法可以在Ada中使用该项目。我知道gpr方法,但opensuse并没有它,我不想在系统上做更多不必要的编码,只是为了绘制一个图。无论如何,我尝试了一种蛮力,将PlPlot的*.adb、*.ads和*.ali复制到本地目录,这是我的xstandard文件。它找到了必要的文件,但未能构建和编译。大量未定义的引用,最后gnatmake:**link失败。尽管某些linux系统上可能存在gprbuild,但建议只在任何系统上运行,然后将例如/opt/GNAT/2020/bin添加到$PATH中。这是因为系统包版本通常已经过时了。现在,如果gnatmake能够找到它,它会调用gprbuild。我部分解决了这个问题。我找到了一个编译和链接成功的Make文件示例。但是,当我手动执行此操作时,我无法链接。显然,我并不完全理解这个过程。我相信这与Make文件中的最后一行命令有关,我不清楚。注意:gnatmake可以通过标记gnatmake-P或gnatmake-P来处理gpr。您找到了吗?如果库的.ads、.ali和.o文件都在lib_dir目录(绝对或相对路径)中,那么只需将
-Ilib_dir
添加到gnatmake即可。有些人喜欢把各种各样的文件放在不同的方向上,使事情变得更加复杂