ADA:Gnat Gprbuild 将没有 .adb 的二进制库添加到项目中

问题描述 投票:0回答:1

我已经使用 Gnatstudio/Gprbuild 在 ADA 中构建了一个静态库。现在,我想在可执行项目中使用它,但我只想提供 .ads 文件和二进制 .a。没有.adb。

我的可执行项目 gpr 文件如下所示:

with "../Libraries/my_lib.gpr";

project Test is

   for Source_Dirs use ("src");
   for Object_Dir use "obj";
   for Main use ("test.adb");

   package Linker is
      for Default_Switches ("ada") use ("-L../Libraries/lib", "-lmy_lib");
   end Linker;

end Test;

库 gpr 文件如下所示:

library project my_lib is

   for Languages use ("Ada");
   for Library_Name use "my_lib";
   for Source_Dirs use ("src");
   for Object_Dir use "obj";
   for Library_Dir use "lib";
   for Library_Kind use "static";

end my_lib;

当我使用库 src 目录中包含广告和 adb 文件的库编译项目时,一切正常并且编译得像一个魅力。

但是当我从库 src 目录中删除 adb 文件时,gpbuild 抱怨它无法编译广告文件。

Compile
   [Ada]          my_lib.ads
cannot generate code for file my_lib.ads (package spec)

而且,是的,这是对的。它无法编译独立的广告文件。

如果我在 my_lib.gpr 中添加

for Excluded_Source_Files use ("my_lib.ads");
,那么编译器会抱怨找不到 my_lib.ads:

Compile
   [Ada]          test.adb
test.adb:2:06: error: file "my_lib.ads" not found

所以,这是我的问题:如何为项目提供一个仅包含 .ads 和 .a 文件的静态库,但阻止编译器尝试编译独立的广告文件,因为它们是依赖项所必需的,但不需要编译。

在 C/C++ 中很容易做到,我有点惊讶在 ADA 中做到如此困难。

ada gprbuild
1个回答
0
投票

好的,我知道了!

在库 gpr 文件中,您需要删除

Object_Dir
行并设置
Externally_Built
开关:

所以,首先,正常编译你的库。 然后修改(或创建另一个)库 gpr 文件。我的库 gpr 文件现在看起来像这样:

   library project my_lib is

   for Languages use ("Ada");
   for Library_Name use "my_lib";
   for Source_Dirs use ("src");
   -- for Object_Dir use "obj";
   for Library_Dir use "lib";
   for Library_Kind use "static";
   for Externally_Built use "true";

end my_lib;

然后,您可以从库 src 目录中删除 adb 并重新编译主项目:一切都编译正常。

其实是grpbuild文档里写的,这里

© www.soinside.com 2019 - 2024. All rights reserved.