2013-07-30 71 views
0

我正在爲基於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運行殘留緩存,這阻止了它的工作?

+0

問題不乾淨。你能否提供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 –

+0

是的。如果在編輯CmakeLists.txt後沒有刪除CMakeCache,有時會發生這種情況 –

回答

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()