4

花屋ライブラリーで申請者を再度コンパイルするのに問題があります。花屋にもっと大きな問題があることが判明しました (最新の 2010 Adacore GPL ダウンロードと Debian アーカイブの 2009 バージョンの両方で同じエラーが発生します)。Florist にはいくつかの低レベルの問題がありますが、生成されたファイルを調べると、errno.h が正しく含まれているようです。

花屋を作成すると、次のようになります。

`c_ntohs' への未定義参照 ./posix-io.o: 関数 `posix__io__open' 内: posix-io.adb:(.text+0x4d1): `__gnat_florist_open' への未定義参照 ./posix-io.o: 関数内 ` posix__io__open_or_create': posix-io.adb:(.text+0xfca): `__gnat_florist_open' への未定義の参照 collect2: ld が 1 つの終了ステータスを返しました gnatlink: /usr/bin/gcc-4.4 gnatmake の呼び出し時にエラーが発生しました: *** リンクに失敗しました。josh@Mini10:~/Demo$ gnatbind -I/usr/share/ada/adainclude/florist -I/usr/include demo josh@Mini10:~/Demo$ gnatlink demo ./posix-implementation.o: 関数内 `posix__implementation__set_ada_error_code ': posix-implementation.adb:(.text+0x19e): `store_errno' への未定義の参照./posix-implementation.o: 関数 `posix__implementation__get_ada_error_code' 内: posix-implementation.adb:(.text+0x1ab):

errno.h が正しく含まれていることに問題がある場合、このエラーはよくあるようです。しかし、posix-cc ファイルからわかる限り、すべて正しいように見えます。これを解決する方法について誰か提案がありますか? Florist の make ファイルは正しくビルドされるので、これがどこから来ているのかわかりません。

4

3 に答える 3

8

OK、これは大きな苦痛であることが判明しましたが、私はそれを見つけました.

Florist バインディングは、共有ライブラリと静的ライブラリの両方として利用できます (両方ともインストールされています)。すべての参照を解決するには、ライブラリに対してリンクする必要があります (実際にライブラリ ソースをアプリケーションにコンパイルすることはできませんでした)。ライブラリについてコンパイル ステージに伝える引数を渡したら、解決する .ads (少なくとも) ファイルを提供する必要があります。

最終的な解決策は次のとおりです。

gnatmake -aI/usr/share/ada/adainclude/florist -aO/usr/lib/ada/adalib/florist demo.adb -largs -lflorist

-aIライブラリの広告ファイルへのパスを提供します。 -aO(この場合) libflorist.so ライブラリ ファイルへのパスを提供し、最後に (これはトリッキーなファイルです)、これが-lfloristどの共有ライブラリであるかを伝えるために渡す必要があります...しかし、それを渡すことは機能しません。-largsコンパイル段階でパラメータが渡されるようにするには、その前にa を配置する必要があります (コンパイルおよびリンカ用)。それがなければ、それらのフェーズは議論を決して見ることはありません!

では、みなさんです!Linux (GCC) で共有 Ada ライブラリに対してコードをコンパイルおよびリンクするには、ライブラリのヘッダー/仕様、ライブラリの場所、および -llibname 引数を -largs とともに指定して、それらを適切な場所に渡す必要があります。

私は今幸せです。これが他の誰かに役立つことを願っています。

于 2010-10-12T16:20:46.937 に答える
2

これは、GNAT プロジェクトを使用して Florist でビルドする簡単な例です。$ADA_PROJECT_PATHがインストールされているディレクトリが含まれていると仮定しますflorist.gpr(私の場合は、$HOME/local/lib/gnat)。

サンプル プログラム (Web で簡単な Florist のデモを見つけることができませんでした。何かありますか?) id.adb:

with POSIX.Process_Identification;
with Ada.Text_IO; use Ada.Text_IO;
procedure Id is
begin
   Put_Line (POSIX.To_String (POSIX.Process_Identification.Get_Login_Name));
end Id;

id.gprと同じディレクトリにあるプロジェクト ファイル ( ) id.adb:

with "florist";
project Id is
   for Main use ("id.adb");
   for Object_Dir use ".build_id";
   for Exec_Dir use ".";
end Id;

ビルド

$ gnatmake -p -P id.gpr
object directory "/Users/simon/florist-gpl-2010-src/demo/.build_id" created for project id
gcc -c -I- -gnatA /Users/simon/florist-gpl-2010-src/demo/id.adb
gnatbind -I- -x /Users/simon/florist-gpl-2010-src/demo/.build_id/id.ali
gnatlink /Users/simon/florist-gpl-2010-src/demo/.build_id/id.ali -lflorist -o /Users/simon/florist-gpl-2010-src/demo/id

そして実行します:

$ ./id
simon
于 2010-10-13T19:16:14.917 に答える
1

それはかなり庭の様々なリンクエラーのように見えます. .h ファイル、Ada オブジェクト ファイル、および C リンク ライブラリの間の何かが完全に一致していません。何を言うのは難しいです。

あなたの最善の策は、同じ問題に遭遇した可能性のある他のフローリストユーザーを探すことです. 彼らのプロジェクト ページはSourceForge にありますが、ここ 6 年間はそれほど活発ではないようです。最新バージョンはそれほど古いものなので、それを使用するには古いコンパイラ (および OS?) が必要になる可能性があります。イク。

于 2010-10-11T15:13:41.447 に答える