要するに、私は 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を使用して他のものをビルドする方法が見つかります。