我正在爲基於cmake的C++項目之一交叉編譯問題掙扎。CMake交叉編譯ARMV5的自定義項目
我的項目使用了許多外部庫。我已經設法在目標環境中構建並安裝了一些目標環境(這是sshfs-mounte:每次構建庫時,我都會立即將它安裝到目標上),例如Boost,Glog,Protobuf,Gtest等等。 。
問題出現在建立我自己的項目時,它似乎與使用變量CMAKE_FIND_ROOT_PATH
有關。
事實上,我建立並安裝的一些依賴關係在$TARGET_FS/usr/lib
中,還有一些依賴關係在$TARGET_FS/usr/local/lib
中。我似乎無法讓cmake通過使用上述變量來找到所有這些變量。
目前,我正在利用交叉編譯cmake的文件,toolchain-arm.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運行殘留緩存,這阻止了它的工作?
問題不乾淨。你能否提供cmake輸出? AFAIR CMAKE_FIND_ROOT_PATH是一個目錄列表,所以你應該使用set(CMAKE_FIND_ROOT_PATH「$ {TARGET_FS}/usr/local」「$ {TARGET_FS}/usr」)。請參閱此處的NOTES http://cmake.org/cmake/help/v2.8.11/cmake.html#command:list –
是的。如果在編輯CmakeLists.txt後沒有刪除CMakeCache,有時會發生這種情況 –