获取艾达(与GNAT编译)来自外部的当前目录中导入文件?(Get Ada (compiled wit

2019-07-31 21:56发布

我在做一个介绍编程课程的大学,选择的语言是艾达。 我编码凯特与GNAT 4.6.3编译。 我们必须用老师提供的库为我们的节目,就像这样:

with foo;
use  foo;

当然,那么文件foo.adb必须被包含在同一目录作为我的源文件。 由于多个项目依赖于这个图书馆,我喜欢把每一个项目在其自己的子目录,我必须将库文件复制到每一个新项目。 更何况有我的库代码和源代码都在同一个目录下。

那么,有没有办法去排序的:

with ../../lib/foo
use ../../lib/foo

我试着找了一下周围,但所有我发现是有关编译器选项的东西。 我宁愿没有与周围的人一团糟,特别是因为只有某些项目将要需要这种特殊的库,所以它是没有意义的,将其添加到全局编译器设置,并有编译器白白搜索路径,它不“T需要搜索。

Answer 1:

我将使用与命令行蚋工程设施gnatmake

我刚刚成立了一个小例子(这样我就可以知道我说的作品!)。 我有3个目录; teacher/包含了教师提供的来源,我想你不会想改变,可不必写访问反正jacks_lib/包含teacher.gpr指向teacher/ (你可以把自己的库代码有作为)和jack/包含你的代码main.adbmain.gpr

jacks_lib/teacher.gpr

project Teacher is
   --  This project calls up the teacher-supplied source.

   --  This is a list of paths, which can be absolute but
   --  if relative are relative to the directory where this .gpr
   --  is found.
   for Source_Dirs use ("../teacher");

   --  Keep the built objects (.ali, .o) out of the way. Use the -p
   --  gnatmake flag to have directories like this built
   --  automatically.
   for Object_Dir use ".build";
end Teacher;

jack/main.gpr

--  teacher.gpr tells where to find library source and how to build it.
with "../jacks_lib/teacher";

project Main is
   --  for Source_Dirs use ("."); (commented out because it's the default)

   --  Keep built objects out of the way
   for Object_Dir use ".build";

   --  Build executables here rather than in Object_Dir
   for Exec_Dir use ".";

   --  What's the main program? (there can be more than one)
   for Main use ("main.adb");
end Main;

jack/main.adb

with Foo;
procedure Main is
begin
   null;
end Main;

然后,在jack/

$ gnatmake -p -P main.gpr
object directory "/Users/simon/tmp/jacks_lib/.build" created for project teacher
object directory "/Users/simon/tmp/jack/.build" created for project main
gcc -c -I- -gnatA /Users/simon/tmp/jack/main.adb
gcc -c -I- -gnatA /Users/simon/tmp/teacher/foo.ads
gnatbind -I- -x /Users/simon/tmp/jack/.build/main.ali
gnatlink /Users/simon/tmp/jack/.build/main.ali -o /Users/simon/tmp/jack/main

我要补充一点,我使用GCC 4.7.0在Mac OS X,但是这能很好地工作任何最近GNAT。



Answer 2:

编译器选项您管理的源代码位置的构建方式-定义“搜索路径” -海湾合作委员会为基础(如GNAT)和大多数其他编译器特别是“-I”(包含)选项。

如果你在命令行建设,它只是一个的问题:

gnatmake -I../../lib/foo -Iother/path -Iyet/another/path project1_main.adb

gnatmake -I../../lib/foo -Isome/path -Iyet/another/path project2_main.adb

如果您在使用GPS(GNAT编程工作室),然后打开Project Properties对话框,选择源显示目录选项卡,并添加有搜索路径。 (您也可以直接直接编辑项目属性文件(“.gpr后”),但我很少这样做。情况因人而异。)编译器设置很容易建立在每个项目的基础上,所以没有‘全局编译器设置’的问题与其中一个人必须要关注自理。



Answer 3:

放大对@ MarcC的回答, GNAT用户指南涵盖gnatmake在第6章,在第6.2节开关为gnatmake:源和库搜索路径切换 ; 指南应包含在您的分布。

gnatmake命令为方便目标make ,如本实施例 。



Answer 4:

它没有在SOFAR答案明确提到,所以我会说:

withuse条款中的Ada 不作任何关于 withed和二手单元的位置要求 ,只有它们存在。

当涉及到真正找到了单位,也就是完全由make脚本和.gpr的文件和编译选项或者你拿出任何其他。

这是艾达如何产生一定程度代码的可移植性(由代码不绑定到一个目录结构!),你只需要改正编译选项:)

此外,了解编译器选项是几乎从来没有一个坏主意,这将有助于你在阿达和许多其他语言。



文章来源: Get Ada (compiled with GNAT) to import files from outside current directory?
标签: ada gnat