我已经使用 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 中做到如此困难。
好的,我知道了!
在库 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文档里写的,这里