我在做一个介绍编程课程的大学,选择的语言是艾达。 我编码凯特与GNAT 4.6.3编译。 我们必须用老师提供的库为我们的节目,就像这样:
with foo;
use foo;
当然,那么文件foo.adb
必须被包含在同一目录作为我的源文件。 由于多个项目依赖于这个图书馆,我喜欢把每一个项目在其自己的子目录,我必须将库文件复制到每一个新项目。 更何况有我的库代码和源代码都在同一个目录下。
那么,有没有办法去排序的:
with ../../lib/foo
use ../../lib/foo
?
我试着找了一下周围,但所有我发现是有关编译器选项的东西。 我宁愿没有与周围的人一团糟,特别是因为只有某些项目将要需要这种特殊的库,所以它是没有意义的,将其添加到全局编译器设置,并有编译器白白搜索路径,它不“T需要搜索。
我将使用与命令行蚋工程设施gnatmake
。
我刚刚成立了一个小例子(这样我就可以知道我说的作品!)。 我有3个目录; teacher/
包含了教师提供的来源,我想你不会想改变,可不必写访问反正jacks_lib/
包含teacher.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
我要补充一点,我使用GCC 4.7.0在Mac OS X,但是这能很好地工作任何最近GNAT。
编译器选项您管理的源代码位置的构建方式-定义“搜索路径” -海湾合作委员会为基础(如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后”),但我很少这样做。情况因人而异。)编译器设置很容易建立在每个项目的基础上,所以没有‘全局编译器设置’的问题与其中一个人必须要关注自理。
放大对@ MarcC的回答, GNAT用户指南涵盖gnatmake
在第6章,在第6.2节开关为gnatmake:源和库搜索路径切换 ; 指南应包含在您的分布。
的gnatmake
命令为方便目标make
,如本实施例 。
它没有在SOFAR答案明确提到,所以我会说:
在with
和use
条款中的Ada 不作任何关于 withed和二手单元的位置要求 ,只有它们的存在。
当涉及到真正找到了单位,也就是完全由make
脚本和.gpr
的文件和编译选项或者你拿出任何其他。
这是艾达如何产生一定程度代码的可移植性(由代码不绑定到一个目录结构!),你只需要改正编译选项:)
此外,了解编译器选项是几乎从来没有一个坏主意,这将有助于你在阿达和许多其他语言。
文章来源: Get Ada (compiled with GNAT) to import files from outside current directory?