22

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

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

私の全体的な目標は、ROSを Linux ボックスで実行することです。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 自体をビルドするのではなく、CMakeを使用して他のものをビルドする方法が見つかります。

4

1 に答える 1

8

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

ちなみに、私はクロスコンパイラの構築にcrosstool-ngを使用するのが好きです。これは、それらをゼロから構築するのに役立つ非常に優れたツールであるため、コンパイラのバージョンと glibc を、ルート ファイルシステムの構築に最初に使用されたものと一致させようとします (通常、ARMedslack の既製のルート ファイルシステムから開始します開発ボックスには Slackware を使用し、ARM ターゲットには ARMedslack を使用します)。

于 2012-10-22T14:05:28.970 に答える