获取Ada(使用GNAT编译)以从当前目录之外导入文件?
我正在大学学习编程入门课程,选择的语言是Ada。我用Kate编写代码,用GNAT 4.6.3编译。我们的课程必须使用教师提供的图书馆,如:获取Ada(使用GNAT编译)以从当前目录之外导入文件?,ada,gnat,Ada,Gnat,我正在大学学习编程入门课程,选择的语言是Ada。我用Kate编写代码,用GNAT 4.6.3编译。我们的课程必须使用教师提供的图书馆,如: with foo; use foo; 当然,那么文件foo.adb必须包含在与源文件相同的目录中。由于多个项目依赖于这一个库,并且我喜欢将每个项目保留在自己的子目录中,因此我必须将库文件复制到每个新项目中。更不用说我的库代码和源代码都在同一个目录中了 那么,有什么办法可以做到: with ../../lib/foo use ../../lib/foo
with foo;
use foo;
当然,那么文件foo.adb
必须包含在与源文件相同的目录中。由于多个项目依赖于这一个库,并且我喜欢将每个项目保留在自己的子目录中,因此我必须将库文件复制到每个新项目中。更不用说我的库代码和源代码都在同一个目录中了
那么,有什么办法可以做到:
with ../../lib/foo
use ../../lib/foo
?
我试着四处看看,但我发现的都是关于编译器选项的东西。我不想去搞这些,特别是因为只有某些项目需要这个特定的库,因此,将其添加到全局编译器设置中并让编译器无意义地搜索它不需要搜索的路径是没有意义的。编译器选项是管理构建的源代码位置的方式——定义“搜索路径”——特别是基于gcc(如GNAT)和大多数其他编译器的“-I”(include)选项
如果您是从命令行进行构建,则只需执行以下操作:
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 Programming Studio),则打开“项目属性”对话框,选择“源目录”选项卡,然后在其中添加搜索路径。(您也可以直接编辑项目属性文件(“.gpr”),但我很少这样做.YMMV。)编译器设置很容易在每个项目的基础上进行设置,因此不存在需要自己关注的“全局编译器设置”问题。在@MarcC的回答中,第6章中的封面
gnatmake
,根据§6.2 gnatmake开关:源和库搜索路径开关;该指南应包含在您的发行版中
如图所示,
gnatmake
命令是make
的方便目标 我将使用GNAT项目工具和命令行gnatmake
我只是举了一个小例子(所以我可以肯定我所说的是有效的!)。我有3个目录teacher/
包含教师提供的源代码,我假设您不想更改,并且可能没有写入权限,jacks\u lib/
包含teacher.gpr
,它指向teacher/
(您也可以将自己的库代码放在那里)和jack/
包含您的代码main.adb
和main.gpr
jacks\u 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;
-- 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.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;
-- 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
我应该补充一点,我在Mac OS X上使用的是GCC 4.7.0,但这对于任何最近的GNAT都应该可以正常工作。目前的答案中没有明确提到这一点,所以我要说: Ada中的
with
和use
子句对所使用和使用的单元的位置不作任何声明,只声明它们存在
当涉及到实际查找单元时,这完全取决于make
脚本和.gpr
文件和编译选项或您提出的任何其他选项
这就是Ada创建代码可移植性的方式(通过不将代码绑定到目录结构!),您只需要更正编译选项:)
此外,了解编译器选项几乎从来都不是一个坏主意,它将在Ada和许多其他语言中为您提供良好的服务。恐怕我们使用的是一个非常简单的文本编辑器,而不是GPS。。。我想我可以写一个bash脚本来为我设置命令行选项,或者其他什么?如果你可以从命令行调用gnatmake,你也可以从脚本调用它。是的,是GNAT使用文件系统的一个实现细节。我们可以在下面的部分添加多个参数吗:for Source_Dirs use(“./teacher”);@lousycoder,是的,这就是为什么家长们:
(“a”、“b”、“c”)
这项功能让事情变得非常方便。。