2012-09-25 73 views
9

我正在做大學編程課程的介紹,選擇的語言是Ada。我正在編寫Kate,並使用GNAT 4.6.3進行編譯。我們必須用老師提供的庫爲我們的節目,像這樣:獲取Ada(用GNAT編譯)從當前目錄外部導入文件?

with foo; 
use foo; 

當然,那麼文件foo.adb必須被包含在同一目錄作爲我的源文件。由於多個項目依賴於這個庫,並且我喜歡將每個項目保存在其自己的子目錄中,所以我必須將庫文件複製到每個新項目中。更何況我的庫代碼和源代碼都在同一個目錄中。

那麼,有沒有辦法去排序的:

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

我試過四處尋找,但所有我找到的是關於編譯器選項的東西。我寧願不必亂用這些東西,尤其是因爲只有某些項目需要這個特定的庫,所以將它添加到全局編譯器設置並讓編譯器毫無意義地搜索它不會執行的路徑是沒有意義的不需要搜索。

回答

8

我會使用GNAT Project工具和命令行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 

我應該補充說我在Mac OS X上使用GCC 4.7.0,但這對任何最近的GNAT都可以正常工作。

5

編譯器選項您管理構建源代碼位置的方式 - 定義「搜索路徑」 - 特別是基於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編程工作室),然後打開Project Properties對話框,選擇源迪爾斯標籤,並在那裏添加搜索路徑。 (您也可以直接編輯項目屬性文件(「.gpr」),但我很少這麼做)YMMV。)編譯器設置很容易在每個項目的基礎上設置,所以沒有「全局編譯器設置」問題哪一個人不得不關心他自己。

+0

恐怕我們使用的是一個漂亮的骨頭文本編輯器,而不是GPS ......我想我可以編寫一個bash腳本來處理爲我設置命令行選項,或者什麼? –

+0

如果你可以從命令行調用gnatmake,你可以同樣從腳本調用它。 –

3

放大上@ MarcC的回答,GNAT User's Guide涵蓋了第6章gnatmake,下6.2節開關爲gnatmake:源和庫搜索路徑切換;該指南應包含在您的發行版中。

gnatmake命令是make的便利目標,如此example所示。

3

它沒有明確SOFAR的答案中提到,所以我會說:

with & use條款在阿達不作任何索賠有關位置的withed &使用的單元,只有它們存在。

當涉及到真正找到了單位,也就是完全由make腳本& .gpr文件&編譯選項或者你拿出任何其他。

這是艾達如何產生一定程度代碼的可移植性(由代碼不綁定到一個目錄結構!),你只需要改正編譯選項:)

此外,瞭解編譯器選項幾乎是從不一個壞主意,它會在很多其他語言中很好地爲你服務。

+1

是的,GNAT使用[_library units_]文件系統的實現細節(http://www.adaic.org/resources/add_content/standards/05rm/html/RM-10.html)。 – trashgod