私の cmake ベースの C++ プロジェクトの 1 つで、クロスコンパイルの問題に苦しんでいます。
私のプロジェクトでは、多くの外部ライブラリを利用しています。Boost、Glog、Protobuf、Gtestなどのように、ターゲット環境(sshfs-mounteです。ライブラリをビルドするたびに、すぐにターゲットにインストールします)にそれらのいくつかをビルドしてインストールすることができました.
自分のプロジェクトを構築するときに問題が発生し、変数の使用に関連しているようですCMAKE_FIND_ROOT_PATH
。
実際、私がビルドしてインストールした依存関係のいくつかは に$TARGET_FS/usr/lib
あり、さらにいくつかは にあり$TARGET_FS/usr/local/lib
ます。前述の変数を使用して、cmakeにそれらすべてを見つけさせることはできないようです。
toolchain-arm.cmake
現在、次の内容のクロス コンパイル cmake ファイルを使用しています。
SET(TARGET_CC arm-linux-gnueabi-gcc-4.6)
SET(TARGET_CXX arm-linux-gnueabi-g++-4.6)
SET(CMAKE_CXX_FLAGS "-fpic -ffunction-sections -funwind-tables -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ -Wno-psabi -march=armv5te -mtune=xscale -msoft-float -fomit-frame-pointer -fstrict-aliasing -funswitch-loops -finline-limit=300 -Wa,--noexecstack")
SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_SYSTEM_VERSION 1)
SET(CMAKE_C_COMPILER ${TARGET_CC})
SET(CMAKE_CXX_COMPILER ${TARGET_CXX})
SET(CMAKE_FIND_ROOT_PATH "${TARGET_FS}/usr/local")
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
次のコマンドを発行して cmake プロセスを呼び出します
cmake -DTARGET_FS=<path/to/target/fs> -DCMAKE_BUILD_TYPE=optimized -DCMAKE_TOOLCHAIN_FILE=../../Cross/toolchain-arm.cmake ../../
CMake は、いくつかの依存関係の欠落について不平を言っています: に存在する依存関係です${TARGET_FS}/usr/lib
(コンパイラの私のヒントfind_root_path
は約${TARGET_FS}/usr/local/lib
であるため、この動作を多少期待しています)。への複数のパスを指定する方法が必要ですが、CMAKE_FIND_ROOT_PATH
それらをスペースで区切り、二重引用符で囲むだけではうまくいかないようです ( SET(CMAKE_FIND_ROOT_PATH "${TARGET_FS}/usr/local ${TARGET_FS}/usr")
)。
この問題に直面する方法についてのヒントはありますか?
セルゲイのコメントへの回答を編集
現在のセットアップでは、この出力が得られます
Boost Libraries Found:
$TARGET_FS/usr/local/lib/libboost_regex.so;
$TARGET_FS/usr/local/lib/libboost_date_time.so;
$TARGET_FS/usr/local/lib/libboost_filesystem.so;
$TARGET_FS/usr/local/lib/libboost_program_options.so;
$TARGET_FS/usr/local/lib/libboost_system.so;
$TARGET_FS/usr/local/lib/libboost_signals.so;
$TARGET_FS/usr/local/lib/libboost_thread.so;
pthread
Boost Includes Found: $TARGET_FS/usr/local/include
COMPILER IS is /usr/bin/arm-linux-gnueabi-g++-4.6
CMAKE_BUILD_TYPE is optimized
Building HAL, platform is: X86
-- Found PROTOBUF: $TARGET_FS/usr/local/lib/libprotobuf.so
-- Looking for include files CMAKE_HAVE_PTHREAD_H
-- Looking for include files CMAKE_HAVE_PTHREAD_H - found
-- Looking for pthread_create in pthreads
-- Looking for pthread_create in pthreads - not found
-- Looking for pthread_create in pthread
-- Looking for pthread_create in pthread - found
-- Found Threads: TRUE
CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
CRYPTO++
linked by target "<target_1>" in directory <directory_1>
DUMBNET
linked by target "<target_2>" in directory <directory_2>
JSONCPP
linked by target "<target_3>" in directory <directory_3>
NET
linked by target "<target_4>" in directory <directory_4>
SNMP_LIB
linked by target "<target_5>" in directory <directory_5>
UHD
linked by target "<target_6>" in directory <directory_6>
編集 2 (解決済み?)
奇妙なことが起こった: 私はすでにそれを試したことがあると確信していますが、ターゲットファイルシステムのルートディレクトリをTARGET_FS
(追加/usr
も/usr/local
追加もなしで) として設定すると、cmake は必要なすべてのパスを見つけることができます。これが機能しないのは、以前のcmake実行の残留キャッシュである可能性がありますか?