1

新しいバージョンの Ubuntu (12.10、12.04 からアップグレード) をインストールしましたが、リンクできません。これは、単純な「Hello_World.adb」プログラムにも当てはまります。

gnatlink hello_world
/usr/gnat/libexec/gcc/i686-pc-linux-gnu/4.5.4/ld: crt1.o: No such file: No such file or directory
collect2: ld returned 1 exit status
gnatlink: error when calling /usr/gnat/bin/gcc

さまざまなフォーラムで多くの「修正」を見てきましたが、それらはブヨでは機能しないようです。これはブヨ自身のコマンド ライン構造に関係していると思います。私は自分でさまざまな構成を試しましたが、役に立ちませんでした。

この問題を解決する方法を知っている人はいますか?


新しい情報: Ubuntu 12.04 を実行する Oracle の「仮想ボックス」を作成し、最新の「libre」GNAT GPL をインストールしましたが、問題なく動作しているようです。どうやら、この問題は Ubuntu 12.10 リリースと関係があるようです。物理マシンと VM の両方で 12.10 を実行しています。どちらも GNAT GPL に失敗します。fwiw

この質問は終了したものとみなします。アイデアや提案をしてくれたみんなに感謝します!

新しい、新しい情報: PATH 変数の設定を怠っていたため、GNAT バイナリへのパスが文字列の末尾にありました。どうやらこれがリンクを許可した理由です。文字列の先頭にバイナリ パスを配置するという GNAT GPL の提案を採用したところ、リンクが機能しなくなりました。くそったれ!アイデアはありますか?

4

5 に答える 5

1

ファイルのアクセス許可とファイル パスを確認します。*nix には非常に壊れやすいパーミッション システムがあり、実際のディレクトリとシンボリック リンクされたディレクトリに依存して動作することがあります。

または、Windows に移行するだけです。ファイルのアクセス許可に関して合計 1 つの問題がありました...それは *nix サブシステム (cygwin、IIRC) 上にありました。

于 2012-11-09T16:25:02.300 に答える
1

64ビットのGNAT GPL 2012でDebianを実行しているようです。フラグgnatmakeを使用して、システムリンカーに送信されるコマンドラインを確認できます。-largs -Wl,-v

$ gnatmake -f hello.adb -largs -Wl,-v
gcc -c hello.adb
gnatbind -x hello.ali
gnatlink hello.ali -Wl,-v
collect2 version 4.5.4 20120510 for GNAT GPL 2012 (20120509) (x86-64 Linux/ELF)
/opt/gnat-gpl-2012/bin/../libexec/gcc/x86_64-pc-linux-gnu/4.5.4/ld --eh-frame-hdr -m
elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o hello
/usr/lib/../lib64/crt1.o /usr/lib/../lib64/crti.o
/opt/gnat-gpl-2012/bin/../lib/gcc/x86_64-pc-linux-gnu/4.5.4/crtbegin.o
-L./ -L/opt/gnat-gpl-2012/lib/gcc/x86_64-pc-linux-gnu/4.5.4/adalib/
-L/opt/gnat-gpl-2012/bin/../lib/gcc/x86_64-pc-linux-gnu/4.5.4
-L/opt/gnat-gpl-2012/bin/../lib/gcc
-L/opt/gnat-gpl-2012/bin/../lib/gcc/x86_64-pc-linux-gnu/4.5.4/../../../../lib64
-L/lib/../lib64 -L/usr/lib/../lib64
-L/opt/gnat-gpl-2012/bin/../lib/gcc/x86_64-pc-linux-gnu/4.5.4/../../..
b~hello.o ./hello.o -v /opt/gnat-gpl-2012/lib/gcc/x86_64-pc-linux-gnu/4.5.4/adalib/libgnat.a
-lgcc -lgcc_eh -lc -lgcc -lgcc_eh /opt/gnat-gpl-2012/bin/../lib/gcc/x86_64-pc-linux-gnu/4.5.4/crtend.o
/usr/lib/../lib64/crtn.o
GNU ld (GNU Binutils) 2.20

これはcrt1.o、/usr/lib64 (YMMV) から (およびその他) を取得していることを示しています。

Ubuntu C コンパイラを (再) インストールする必要があるのでしょうか? (だったと思いますsudo apt-get build-essentials)。

一方、dpkg --search(特定のファイルをインストールしたインストール済みパッケージを見つけるために) を使用すると、単に package libc、またはおそらくlibc-dev.

于 2012-11-10T18:22:01.880 に答える
1

私がこの問題に遭遇したときはいつでも、それは通常、Debian の新しいバージョンの「マルチライブラリ問題」の現れであり、現在、Ubuntu はライブラリを移動しているため、たとえば 32 ビットおよび 64 ビットの実行可能ファイル (またはWindowsまたはArduino用にクロスコンパイルしてください!)同じマシン上で...

したがって、私のマシンでは、crt1.o を次の場所で見つけることができます。

/usr/lib/x86_64-linux-gnu/crt1.o

コマンドラインを発行すると

export LIBRARY_PATH=/usr/lib/x86_64-linux-gnu

Gnatmake を実行する前に、問題を解決します。失敗するのはリンカー (ld) であるため、試してみることをお勧めします。

export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu

LIBRARY_PATH が機能しない場合

それだけなら、.bashrcスクリプトでライブラリパスをいじる方法など、問題を解決する他の方法があります...

于 2012-11-12T17:28:44.533 に答える
0

私は同じ問題に遭遇しましたが、見つけることができた唯一の解決策は、スーパーユーザーとして次のコマンドを実行することでした:

ln -s /usr/lib/x86_64-linux-gnu /usr/lib64
于 2013-09-10T12:02:24.750 に答える
0

みんなありがとう。上記の提案をすべて試し、GPS、以前は動作していた Ubuntu バージョン、およびハード マシンと仮想マシンのすべての組み合わせを試しましたが、成功しませんでした。

wposix 製品に実装されているのはパイプだけなので、パイプを使用した (非常に) 制限された Windows Posix (wposix) バージョンの追求に成功しています。共有メモリとメッセージングを使用したかったのです。

于 2012-12-10T17:19:10.087 に答える