開発に使用する仮想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をアンインストールしましたが、まだ機能しませんでした。
誰も私がこれを修正する方法を知っていますか?
問題は、現在のアーキテクチャ用のgccしか持っていない可能性があり、それが64ビットだということです。 32ビットのサポートファイルが必要です。そのためには、それらをインストールする必要があります
Sudo apt install gcc-multilib
私を助けたのは、シンボリックリンクを作成することです。
Sudo ln -s /usr/lib/x86_64-linux-gnu /usr/lib64
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:コメントで簡単に答えられましたが、ここに答えがありますので、誰かがこれに遭遇して答えを探しているかもしれないが、コメントではなく、コメントが十分に明確ではない場合に備えて記録があります。
これは 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
「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アーキテクチャしか得られず、本質的にマルチアーチを無効にすることに注意してください。これはあなたが望むものかもしれませんが、最適な解決策ではないかもしれません。
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
を追加するだけです。
RHEL 7 64ビットを取得してgcc 4.8 32ビットプログラムをコンパイルするには、2つのことを行う必要があります。
すべての32ビットgcc 4.8開発ツールが完全にインストールされていることを確認してください。
Sudo yum install glibc-devel.i686 libgcc.i686 libstdc++-devel.i686 ncurses-devel.i686
-m32フラグを使用してプログラムをコンパイルします
gcc pgm.c -m32 -o pgm
ここから盗まれました: 64ビットRHELで32ビットアプリをコンパイルする方法 -ステップ1を実行するだけでした。
crti.o file missing で説明されているように、「gcc -print-search-dirs」を使用してすべての検索パスを見つけることをお勧めします。次に、上記の「Sudo ln -s」の説明に従って、crt1.oの場所を指すリンクを作成します
./configure --disable-multilib
それのために働く
これはUbuntu 16.04でうまくいきました
$ LIBRARY_PATH=/usr/lib/x86_64-linux-gnu
$ export LIBRARY_PATH
CentOs 5.4でこれを実行しました。 lib64にはcrt * .oファイルが含まれていましたが、libには含まれていませんでした。 yumを介してglibc-develをインストールすると、i386ビットがインストールされ、問題が解決しました。
次のように解決しました:
1)find -name ctr1.o
を使用してctr1.oおよびctri.oファイルを見つけようとします
コンピューターに次のものがあります:$/usr/lib/i386-linux/gnu
2)そのパスをPATH
(LIBRARY_PATH
)環境変数に追加します(どちらが名前であるかを確認するには、ターミナルでenv
コマンドを入力します)。
$PATH=/usr/lib/i386-linux/gnu:$PATH
$export PATH
今日も同じ問題がありましたが、推奨パッケージをインストールすることで解決しました:libc6-dev-mipsel-cross libc6-dev-mipsel-cross、libc-dev-mipsel-cross
これはうまくいきました:
Sudo apt-get install libc6-dev-mipsel-cross
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も同じディレクトリにあります