web-dev-qa-db-ja.com

GNU ARMのEABIを削除せずに、64ビットで32アプリケーションをコンパイルします

64ビット16.04で32ビットのC++プログラムを構築したい。

/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/5/libstdc++.so when searching for -lstdc++
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/5/libstdc++.a when searching for -lstdc++
/usr/bin/ld: cannot find -lstdc++
collect2: error: ld returned 1 exit status

g ++を使用したリンクは-lstdc ++の検索に失敗します 私はすべきだと言っています install libc6-i386 libc6-dev-i386 lib32gcc1 lib32stdc++6

Reading package lists... Done
Building dependency tree       
Reading state information... Done
lib32gcc1 is already the newest version (1:6.0.1-0ubuntu1).
lib32gcc1 set to manually installed.
libc6-dev-i386 is already the newest version (2.23-0ubuntu3).
libc6-dev-i386 set to manually installed.
libc6-i386 is already the newest version (2.23-0ubuntu3).
lib32stdc++6 is already the newest version (5.3.1-14ubuntu2.1).
0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.

OK、良い、今受け入れられた答えを試してみましょう: install g++-multilib (またはgcc-multilib、結果は同じです):

Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages were automatically installed and are no longer required:
  binutils-arm-linux-gnueabi cpp-5-arm-linux-gnueabi cpp-arm-linux-gnueabi gcc-5-arm-linux-gnueabi-base
  gcc-5-cross-base libasan2-armel-cross libasan2-dbg-armel-cross libatomic1-armel-cross libatomic1-dbg-armel-cross
  libc6-armel-cross libc6-armhf-armel-cross libc6-armhf-cross libc6-dev-armel-cross libc6-dev-armhf-armel-cross
  libc6-dev-armhf-cross libgcc-5-dev-armel-cross libgcc1-armel-cross libgcc1-dbg-armel-cross libgomp1-armel-cross
  libgomp1-dbg-armel-cross libhfasan2-armel-cross libhfatomic1-armel-cross libhfgcc-5-dev-armel-cross
  libhfgcc1-armel-cross libhfgomp1-armel-cross libhfstdc++6-armel-cross libhfubsan0-armel-cross libstdc++6-armel-cross
  libubsan0-armel-cross libubsan0-dbg-armel-cross linux-libc-dev-armel-cross linux-libc-dev-armhf-cross
Use 'Sudo apt autoremove' to remove them.
The following additional packages will be installed:
  g++-5-multilib gcc-multilib lib32gcc1-dbg lib32stdc++-5-dev lib32stdc++6-5-dbg libx32gcc1-dbg libx32stdc++-5-dev
  libx32stdc++6-5-dbg
The following packages will be REMOVED:
  gcc-5-arm-linux-gnueabi gcc-5-multilib-arm-linux-gnueabi gcc-arm-linux-gnueabi
The following NEW packages will be installed:
  g++-5-multilib g++-multilib gcc-multilib lib32gcc1-dbg lib32stdc++-5-dev lib32stdc++6-5-dbg libx32gcc1-dbg
  libx32stdc++-5-dev libx32stdc++6-5-dbg
0 upgraded, 9 newly installed, 3 to remove and 1 not upgraded.
Need to get 14.7 MB of archives.
After this operation, 82.5 MB of additional disk space will be used.

私はラップトップでGNU C11をビルドして携帯電話で実行できるようにしています( こちらを参照 )。これはarm-linux-gnueabi-gccで可能ですので、それを取り除きたいのです。 (C++ 11でも同じことをすることに興味はありません)。

gcc-multilibがインストールする新しいパッケージはC++のみのようですが、CコンパイラとARMおよび他のプラットフォームのbinutilsを削除します。

32ビットGNU C++ 11とARM GNU C11のコンパイラーを同時に使用できますか?

3
cat

他のアーキテクチャコンパイラのパッケージインストールは、それらをシステム領域に配置します。実行可能ファイルには一意の名前が付けられていますが、パッケージは非常に「便利」であり、実際にそれらを指す短い名前のリンク(gccなど)が必要であると考えています。これは、ある種のツールチェーン専用の仮想マシンでは問題ないかもしれませんが、通常の状況では望ましくありません。

パッケージを自分で解凍し、必要に応じて実行可能ファイルを/ usr/binにコピーできます。複数のユーザーがコンパイラーを使用している場合、それがその方法になりますが、単一ユーザーとして、私は気にしませんでした。私は自分のディレクトリでローカルに解凍し、必要に応じて環境変数とローカルリンクを設定しました。欠点は、パッケージの更新がリリースされたときに取得できないことです。利点は、コンパイラのバージョンを変更し、古いものに対して新しいインストールをテストし、新しいパッケージがニーズを満たしていることを検証したら、切り替えることができることを選択することです。新しいバージョン名は古いものと変わらないため、新しいバージョンを標準システム領域に配置することではできません。

ローカルツールチェーンセットアップスクリプトの例:

$ cat crossexp
MY_ARM_BASE=${HOME}/dev/toolchain/arm-2008q3
C_INCLUDE_PATH=${MY_ARM_BASE}/lib/gcc/arm-none-linux-gnueabi/4.3.2/include:${MY_ARM_BASE}/lib/gcc/arm-none-linux-gnueabi/4.3.2/include-fixed
LIBRARY_PATH=${MY_ARM_BASE}/arm-none-linux-gnueabi/libc/lib:${MY_ARM_BASE}/arm-none-linux-gnueabi/libc/usr/lib
CPLUS_INCLUDE_PATH=${MY_ARM_BASE}/arm-none-linux-gnueabi/include/c++/4.3.2
#OBJC_INCLUDE_PATH
COMPILER_PATH=${MY_ARM_BASE}/bin
#LD_RUN_PATH
#GPROF_PATH
#######
CC=${COMPILER_PATH}/gcc
CXX=${COMPILER_PATH}/g++
RANLIB=${COMPILER_PATH}/ranlib
STRIP=${COMPILER_PATH}/strip
export C_INCLUDE_PATH LIBRARY_PATH CPLUS_INCLUDE_PATH OMPILER_PATH
export CC CXX RANLIB STRIP

実行可能ファイルは$ {COMPILER_PATH}にあり、次のような名前が付いています。
arm-none-linux-gnueabi-gccを使用すると、そのディレクトリに短い名前のリンクを追加できます。

ln -s arm-none-linux-gnueabi-gcc gcc

利便性のために、ほとんどのメイクファイルは上記のような定義を実行します。フルネームは短い名前の代わりに簡単に使用できます。

各アーキテクチャ用のセットアップスクリプトがあり、アーキテクチャ内のコンパイラの異なるバージョン用のセットアップスクリプトを持つことができます。

1
ubfan1