web-dev-qa-db-ja.com

コンパイルの問題:crt1.oが見つかりません

開発に使用する仮想Debianシステムがあります。

今日はllvm/clangを試してみたかったです。

Clangをインストールした後、古いc-projectsを(gccで)コンパイルできません。これはエラーです:

...
/usr/bin/ld: cannot find crt1.o: No such file or directory
/usr/bin/ld: cannot find crti.o: No such file or directory
collect2: ld returned 1 exit status
...

Clangをアンインストールしましたが、まだ機能しませんでした。

誰も私がこれを修正する方法を知っていますか?

99
Stefan Keller

Debian/Ubuntu

問題は、現在のアーキテクチャ用のgccしか持っていない可能性があり、それが64ビットだということです。 32ビットのサポートファイルが必要です。そのためには、それらをインストールする必要があります

Sudo apt install gcc-multilib
72
Dmitry Pavlenko

私を助けたのは、シンボリックリンクを作成することです。

Sudo ln -s /usr/lib/x86_64-linux-gnu /usr/lib64
60
Karel Lenc

Llvm/clangで遊んでいる間に、あなた(またはパッケージマネージャー)が以前に存在した標準Cライブラリ開発パッケージ(Debianでは eglibc )を削除したか、最初にインストールしていない可能性がありますgccに戻したので、再インストールする必要があります。

Debianで次のようにできます。

aptitude show libc-dev

Ubuntu:

apt-get install libc-dev

Ubuntuでは、libc-devがない場合、packages.ubuntu.comで見つけることができないため、libc6-devを直接インストールしてみてください。

または、Redhatのようなシステムでは:

yum install glibc-devel

NB:コメントで簡単に答えられましたが、ここに答えがありますので、誰かがこれに遭遇して答えを探しているかもしれないが、コメントではなく、コメントが十分に明確ではない場合に備えて記録があります。

33
Shinnok

これは BUG ランチパッドで報告されますが、回避策があります:

これを実行して、これらのファイルの場所を確認します

$ find /usr/ -name crti*
/usr/lib/x86_64-linux-gnu/crti.o

次に、このパスをLIBRARY_PATH変数に追加します

$ export LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LIBRARY_PATH
25
Umair R

「wheezy」と呼ばれるDebianのテストバージョンを使用している場合、マルチアーチへの移行に噛まれた可能性があります。 Debianのmultiarchの詳細はこちら: http://wiki.debian.org/Multiarch

基本的に、さまざまなアーキテクチャ固有のライブラリがファイルシステムの従来の場所から新しいアーキテクチャ固有の場所に移動されています。これが/usr/bin/ldが混乱している理由です。

これで、/usr/lib64/と_/usr/lib/i386-linux-gnu/の両方にcrt1.oが見つかるので、ツールチェーンにそのことを伝える必要があります。これを行う方法に関するドキュメントを次に示します。 http://wiki.debian.org/Multiarch/LibraryPathOverview

シンボリックリンクを作成するだけでは、oneアーキテクチャしか得られず、本質的にマルチアーチを無効にすることに注意してください。これはあなたが望むものかもしれませんが、最適な解決策ではないかもしれません。

17
jeremiah

http://wiki.debian.org/Multiarch/LibraryPathOverview jeremiahが投稿した記事を読んだ後、シンボリックリンクなしで機能するgccフラグを見つけました。

gcc -B/usr/lib/x86_64-linux-gnu hello.c

そのため、MakefileのCFLAGS変数に-B/usr/lib/x86_64-linux-gnuを追加するだけです。

13
alexm

RHEL 7 64ビットを取得してgcc 4.8 32ビットプログラムをコンパイルするには、2つのことを行う必要があります。

  1. すべての32ビットgcc 4.8開発ツールが完全にインストールされていることを確認してください。

    Sudo yum install glibc-devel.i686 libgcc.i686 libstdc++-devel.i686 ncurses-devel.i686
    
  2. -m32フラグを使用してプログラムをコンパイルします

    gcc pgm.c -m32 -o pgm
    

ここから盗まれました: 64ビットRHELで32ビットアプリをコンパイルする方法 -ステップ1を実行するだけでした。

8
bulltorious

crti.o file missing で説明されているように、「gcc -print-search-dirs」を使用してすべての検索パスを見つけることをお勧めします。次に、上記の「Sudo ln -s」の説明に従って、crt1.oの場所を指すリンクを作成します

5
tienping

./configure --disable-multilib

それのために働く

3
Chunyang Kwok

これはUbuntu 16.04でうまくいきました

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

CentOs 5.4でこれを実行しました。 lib64にはcrt * .oファイルが含まれていましたが、libには含まれていませんでした。 yumを介してglibc-develをインストールすると、i386ビットがインストールされ、問題が解決しました。

1
Shrinivas

次のように解決しました:

1)find -name ctr1.oを使用してctr1.oおよびctri.oファイルを見つけようとします

コンピューターに次のものがあります:$/usr/lib/i386-linux/gnu

2)そのパスをPATHLIBRARY_PATH)環境変数に追加します(どちらが名前であるかを確認するには、ターミナルでenvコマンドを入力します)。

$PATH=/usr/lib/i386-linux/gnu:$PATH
$export PATH
0
pac88

今日も同じ問題がありましたが、推奨パッケージをインストールすることで解決しました:libc6-dev-mipsel-cross libc6-dev-mipsel-cross、libc-dev-mipsel-cross

これはうまくいきました:

Sudo apt-get install libc6-dev-mipsel-cross
0
krusty

I686-cm-linux-gccをクロスコンパイルしているときに、同じコンパイルエラーが発生しました。

以下のコンパイルオプションは私の問題を解決しました

$ i686-cm-linux-gcc a.c --sysroot=/opt/toolchain/i686-cm-linux-gcc

注:sysrootは、usr/includeが利用可能なコンパイラディレクトリを指す必要があります

私の場合、ツールチェーンは/ opt/toolchain/i686-cm-linux-gccディレクトリにインストールされ、usr/includeも同じディレクトリにあります

0
Bhagavan