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


114

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

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

clangをインストールした後、古いgプロジェクトを(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をアンインストールしましたが、それでも機能しませんでした。

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


6
インストールしてみてくださいlibc0.1-dev
Michas

1
マックについては、以下を参照してくださいstackoverflow.com/questions/1365211/...
kenorb


回避策はありBYTこれは、ランチパッドで報告BUGです:askubuntu.com/questions/251978/...
ローマン

回答:


91

Debian / Ubuntu

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

sudo apt install gcc-multilib

2
Ubuntuではこれが機能sudo apt-get install gcc-multilibし、エラーが修正されましたgfortran -m32 ...
randwa1k

1
64 32対の原因に言及し、より具体的な質問:stackoverflow.com/questions/21724540/...
チロSantilli郝海东冠状病六四事件法轮功

62

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

sudo ln -s /usr/lib/x86_64-linux-gnu /usr/lib64

5
これは機能しますが、Debianマルチアーチ上で1つのアーチを効果的に提供します。
エレミヤ2012年

2
誰かがtarバンドルとしてくれたクロスコンパイルツールチェーンをセットアップしようとすると、同じ問題が発生しました。strace(つまり、「strace gcc <すべての引数> 2>&1 | grep crt1.o」)を使用して、gccがcrt1.oを探している場所を確認する必要があったので、作成するシンボリックリンクを特定できました。
Andrew Bainbridge

37

llvm / clangで遊んでいる間に、あなた(またはパッケージマネージャー)が以前の既存の標準Cライブラリ開発パッケージ(eglibc)を削除したようです Debianのそれをインストールしていない可能性があるため、再インストールする必要があるようですこれで、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

注意:あなたはコメントで簡単に答えられましたが、ここに答えがあります。誰かがこれに遭遇し、答えを探している可能性がある場合に備えて、記録にありますが、コメントにないか、コメントが十分に明確ではありません。


1
そのdebianのmultiarchのものは多くのビルドを壊しませんが、多くの場合このエラーが発生します。LD_LIBRARY_PATHをエクスポートすることができます。
deadalnix、2011

3
これはアルパインLinuxに役立ちますapk add libc-dev=0.7.1-r0
Yu Jiaao 2018

27

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

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

$ 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

14.04で動作します。これは、システムのライブラリを
壊し

17

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

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

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

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


3
「それについてツールチェーンを伝える」方法についてもう少し詳しく説明すると、これがまさに私の状況です。ありがとう。
SullX 2013

まず、どのアーキテクチャを構築するのかを知る必要があります。AMD64ベースのアプリケーションを構築していますか?その場合、AMD64ベースの共有オブジェクトファイルの場所、つまり必要な.oファイルを「ld」に通知する必要があります。AMD64で作業している場合、それらは/ usr / lib64にあるはずです
jeremiah

16

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

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

したがって、-B/usr/lib/x86_64-linux-gnuMakefileのCFLAGS変数に追加するだけです。


@DjDacは、Ubuntu 16.04、AFAICTではフラグを必要としません。
alexm

9

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を実行するだけで済みました。



3

これはUbuntu 16.04で私のために働いた

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


1

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


0

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

私はそれを次のように解決しました:

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

私は自分のコンピュータに次のものを手に入れました: $/usr/lib/i386-linux/gnu

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

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

回避のconfussionsに、ラインの$ PATH =は/ usr / libに/ I386-linuxの/ GNU:$ PATHの$輸出PATHが本当にある:
pac88

0

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

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

sudo apt-get install libc6-dev-mipsel-cross

-1

私の場合、Matlabからの実行パス構成が原因でcrti.oエラーが発生しました。たとえば、実行ディレクトリのパスを以前に設定していない場合、ファイルを実行できません。これを行うには:ファイル> setPath、ディレクトリを追加して保存します。



-2

私の場合、Ubuntu 16.04私はまったく持っていませんcrti.o

$ find /usr/ -name crti*

だから私は開発者libc 6 -devパッケージをインストールします:

sudo apt-get install libc6-dev
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.