0

私の 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実行の残留キャッシュである可能性がありますか?

4

1 に答える 1

0

このようなものを使用して、検索パスを指定しました。クロス コンパイルされたライブラリへのパスを指定できます。

set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH}
              /lib
              /usr/lib
              /usr/lib/arm-linux-gnueabihf
              /usr/local/lib)

find_library(LIBSSL NAMES libssl.so PATHS)

add_executable(myapp ${myapp_SRC} )

if(LIBSSL )
  message(STATUS ${LIBSSL})
  target_link_libraries(myapp
            ${LIBSSL} )
else()
  message(FATAL_ERROR "FATAL ERROR: missing library")
endif()
于 2014-03-21T15:09:09.847 に答える