2013-07-30 3 views
0

내 cmake 기반 C++ 프로젝트 중 하나에 대한 크로스 컴파일 문제로 고민하고 있습니다.CMake ARMV5 용 사용자 정의 프로젝트를 크로스 컴파일

내 프로젝트는 많은 외부 라이브러리를 사용합니다. 내가 구축하고 타겟 환경 (sshfs-mounte입니다 : 빌드 할 때마다 나는 라이브러리를 빌드 할 때마다 즉시 대상에 설치합니다.), Boog, 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 불평 다음 명령을 실행하여 몇 가지 누락 된 종속성에 대해 : find_root_path에있는 컴파일러에 대한 내 힌트는 ${TARGET_FS}/usr/local/lib인데,이 동작이 다소 기대된다고 생각하면 ${TARGET_FS}/usr/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

는 사건이 발생했다 이상한 뭔가 제공 이미 시도했지만 목표 파일 시스템의 루트 디렉토리를 다음과 같이 설정했습니다. (/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() 
관련 문제