我正在大学学习编程入门类(class),选择的语言是 Ada。我正在 Kate 中编码并使用 GNAT 4.6.3 进行编译。我们必须为我们的程序使用教师提供的库,如下所示:
with foo;
use foo;
当然,文件 foo.adb
必须包含在与我的源文件相同的目录中。由于多个项目依赖于这个库,并且我喜欢将每个项目保留在自己的子目录中,因此我必须将库文件复制到每个新项目中。更不用说我的库代码和源代码都在同一目录中。
那么有什么办法可以实现吗:
with ../../lib/foo
use ../../lib/foo
?
我尝试四处查看,但发现的只是有关编译器选项的内容。我不想弄乱这些,特别是因为只有某些项目需要这个特定的库,所以将它添加到全局编译器设置并让编译器毫无意义地搜索它不包含的路径是没有意义的不需要搜索。
最佳答案
我将通过命令行 gnatmake
使用 GNAT 项目工具。
我只是举了一个小例子(所以我可以确定我所说的有效!)。我有3个目录; teacher/
包含教师提供的源代码,我假设您不想更改该源代码,并且可能没有写入权限,jacks_lib/
包含 teacher.txt。 gpr
指向 teacher/
(您也可以将自己的库代码放在那里),而 jack/
包含您的代码 main.adb
和 main.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
我应该补充一点,我在 Mac OS X 上使用 GCC 4.7.0,但这应该可以与任何最新的 GNAT 一起正常工作。
关于ada - 让 Ada(用 GNAT 编译)从当前目录外部导入文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12582796/