10

私は大学でプログラミングコースの紹介をしています。選択した言語はAdaです。私はKateでコーディングし、GNAT4.6.3でコンパイルしています。次のように、プログラムには教師が提供するライブラリを使用する必要があります。

with foo;
use  foo;

もちろん、ファイルfoo.adbは私のソースファイルと同じディレクトリに含まれている必要があります。複数のプロジェクトがこの1つのライブラリに依存しており、各プロジェクトを独自のサブディレクトリに保持したいので、ライブラリファイルを新しい各プロジェクトにコピーする必要があります。言うまでもなく、私のライブラリコードとソースコードはすべて同じディレクトリにあります。

だから、行く方法はありますか?

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

少し調べてみましたが、見つけたのはコンパイラオプションに関するものだけです。特に、特定のプロジェクトのみがこの特定のライブラリを必要とするため、それらをいじくり回す必要はありません。そのため、グローバルコンパイラ設定に追加して、コンパイラに無意味にパスを検索させるのは意味がありません。検索する必要はありません。

4

4 に答える 4

9

コマンドラインでGNATプロジェクト機能を使用しますgnatmake

私はほんの少しの例を設定しました(それで私が言うことがうまくいくと確信することができます!)。私は3つのディレクトリを持っています。teacher/教師が提供したソースが含まれています。これは、変更したくないと思いますが、とにかく書き込みアクセス権がない可能性があります。ポイントをjacks_lib/含み(独自のライブラリコードをそこに置くこともできます) 、コードとを含みます。teacher.gprteacher/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 OSXでGCC4.7.0を使用していることを追加する必要がありますが、これは最近のGNATで正常に機能するはずです。

于 2012-09-25T17:21:20.407 に答える
6

コンパイラオプション、ビルドのソースコードの場所を管理する方法であり、「検索パス」を定義します。特に、gccベース(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プログラミングスタジオ)を使用している場合は、[プロジェクトのプロパティ]ダイアログを開き、[ソースディレクトリ]タブを選択して、そこに検索パスを追加します。(プロジェクトプロパティファイル( ".gpr")を直接編集することもできますが、それを行うことはめったにありません。YMMV。)コンパイラ設定はプロジェクトごとに簡単に設定できるため、「グローバルコンパイラ設定」の問題はありません。どちらが自分自身に関係しなければならないでしょう。

于 2012-09-25T13:00:31.843 に答える
4

それは回答ソファで明示的に言及されていないので、私はそれを言います:

Adaのwith&句は、使用済みおよび使用済みのユニットの場所については主張せず、存在することのみ主張します。use

実際にユニットを見つけることになると、それは完全にmakeスクリプトと.gprファイルとコンパイルオプションまたはあなたが思いついた他のものにかかっています。

これは、Adaがある程度のコード移植性を作成する方法です(コードをディレクトリ構造にバインドしないことによって!)、コンパイルオプションを修正する必要があります:)

また、コンパイラオプションについて学ぶことは、決して悪い考えではありません。Adaや他の多くの言語で役立ちます。

于 2012-09-26T08:09:49.180 に答える
3

@MarcCの回答を増幅して、GNATユーザーガイドgnatmake第6章の§6.2gnatmakeのスイッチ:ソースおよびライブラリの検索パススイッチについて説明しています。ガイドはディストリビューションに含まれている必要があります。

この例に示すように、このコマンドgnatmakeはの便利なターゲットです。make

于 2012-09-25T16:09:27.733 に答える