web-dev-qa-db-ja.com

ARMのCMakeでCMakeをクロスコンパイルする方法

要するに、私はCMakeをCMakeとクロスコンパイルしようとしているのですが、ライブラリを正しくリンクしているとは思いません。私がしたいことはできないかもしれませんが、それが事実である場合、それがなぜ不可能であるのかを知りたいのです。

システム:ホストはCavium ARM9 CPUを搭載した Linuxボックス です。現在Linuxカーネルのバージョン2.6.24.4と Debian 5. (Lenny)を実行しています。私のワークステーションは Core i5 Ubuntu 12.04 LTS(Precise Pangolin)を実行しています。

私の全体的な目標は、Linuxボックスで [〜#〜] ros [〜#〜] を実行することです。 Debian 6.0(Squeeze)バイナリはCaviumが提供しない親指サポートが必要であり、必要なパッケージの多くがDebian 5.0(Lenny)で利用できないため、aptではなくソースからコンパイルする必要があります。必要なさまざまなライブラリのインストールを進めましたが、ステップ1.3.1に達してCMakeを実行しようとすると、エラーが発生しました

CMake 2.8以降が必要です。バージョン2.6.0を実行している

次に、Linuxボックス自体にCMake 2.8.8をダウンロードしてビルドしようとしましたが、システムには多すぎます。それが失敗したとき、メーカーのWebサイトで提案されているツールチェーンをダウンロードし、[www.cmake.org/Wiki/CMake_Cross_Compiling]のクロスコンパイルガイドを使用して、CMake実行可能ファイルをビルドしました。これが私のツールチェーンファイルです:

# This one is important
SET(CMAKE_SYSTEM_NAME Linux)

# Specify the cross compiler
SET(CMAKE_C_COMPILER   /pathto/crosstool-linux-gcc-4.5.2-gclibc-2.9-oabi/arm-unknown-linux-gnu/bin/arm-unknown-linux-gnu-gcc)
SET(CMAKE_CXX_COMPILER /pathto/crosstool-linux-gcc-4.5.2-gclibc-2.9-oabi/arm-unknown-linux-gnu/bin/arm-unknown-linux-gnu-g++)

# Where is the target environment
SET(CMAKE_FIND_ROOT_PATH  /pathto/crosstool-linux-gcc-4.5.2-gclibc-2.9-oabi/arm-unknown-linux-gnu /pathto/crosstool-linux-gcc-4.5.2-gclibc-2.9-oabi/arm-unknown-linux-gnu/arm-unknown-linux-gnu)

# Search for programs in the build Host directories
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)

# For libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

ただし、Linuxボックスでバイナリを使用するとエラーが発生する

cmake:/usr/lib/libstdc++.so.6:バージョン `GLIBCXX_3.4.14 'が見つかりません(cmakeで必要)

案の定、ライブラリはありません:

Prompt# strings /usr/lib/libstdc++.so.6 | grep GLIBC
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBC_2.3
GLIBC_2.0
GLIBC_2.3.2
GLIBC_2.1
GLIBC_2.1.3
GLIBC_2.2
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH

私はこれまでクロスコンパイルしたことがありませんが、2つのシナリオのいずれかが発生しているのがわかります。バイナリがホストマシン上のglibcxxの上位バージョンへのリンクで作成されているか、製造元のツールチェーンがイメージよりも新しいです。何が起こっているのか、または知らない何かが起こっているのかどうかを確認する方法がわかりません。

私の最後の努力は、CMakeを静的にクロスコンパイルして、うまくいけばリンクエラーを取り除くことを含む

cmake -DCMAKE_TOOLCHAIN_FILE=../toolchain-technologic.cmake -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_EXE_LINKER_FLAGS_RELEASE="-static" ..

ビルドエラーが発生し、そのバイナリも機能しませんでした。私は得ました:

FATAL: kernel too old
Segmentation fault

Linuxボックスにglibcxx 3.4.14をインストールしてみますが、このプロセッサーでは使用できないようです。

CMakeの依存関係またはシステム要件を検索してみましたが、何も見つかりません。私はCMakeのビルド方法についても検索しましたが、ほとんどの検索で、CMake自体をビルドするのではなく、withCMakeで他のものをビルドする方法が見つかります。

15
tbh

私はCMakeを使用してARM9デバイス用に多くのクロスコンパイルを行っていますが、実際、これはターゲットデバイス上にある同じライブラリにリンクしていないようです。 CMakeをビルドする必要はありません。バージョン2.6以降、クロスコンパイルがサポートされているためです。 CMAKE_FIND_ROOT_PATH変数を、ターゲットデバイス上にあるルートファイルシステムの正確なコピーがあるパスに設定することを確認してください(ターゲットプロセッサ用に事前にコンパイルされたライブラリとバイナリを使用)。それはあなたの問題を解決するはずです。

補足として、私は crosstool-ng を使用してクロスコンパイラーを構築します。これは、最初からルートファイルシステムを構築するために使用されたものとコンパイラバージョンおよびglibcを一致させるように試みる、本当に素晴らしいツールです(通常、既製のルートファイルシステムから開始します ARMedslack 、私は開発ボックスにSlackwareを、私のARMターゲット)にARMedslackを使用しているため。

5
Claudio