2012-10-11 4 views
10

간단히 말해 CMake와 CMake를 컴파일하려고하는데 라이브러리를 올바르게 연결한다고 생각하지 않습니다. 내가하고 싶은 일은 가능하지 않을 수도 있지만, 적어도 그것이 가능하지 않은 이유가 무엇인지 알고 싶습니다.CMake와 ARM을위한 CMake 컴파일 방법

시스템 : 호스트는 Cavium ARM9 CPU를 장착 한 Linux box입니다. 현재 Linux 커널 2.6.24.4 버전과 Debian 5.0 (Lenny) 버전을 실행 중입니다. 내 워크 스테이션은 우분투   12.04 LTS (Precise Pangolin)를 실행하는 Core i5입니다.

전반적인 목표는 ROS을 Linux 상자에서 실행하는 것입니다. 데비안   6.0 (Squeeze) 바이너리는 Cavium이 제공하지 않는 엄지 지원을 필요로하며 데비안   5.0 (Lenny)에는 필요한 패키지가 많지 않기 때문에 apt 대신 소스를 사용하여 컴파일해야합니다. 나는 다양한 라이브러리를 설치하는 과정을 진척 시켰지만 1.3.1 단계에서 CMake를 실행하려고했을 때 오류가 발생했습니다.

CMake 2.8 이상이 필요합니다. 당신은 버전 2.6.0을 실행 중입니다

다음은 리눅스 시스템 자체에서 CMake 2.8.8을 다운로드하여 빌드하려고 시도했지만 시스템에 너무 많이 사용되었습니다. 그게 실패했을 때, 제조사의 웹 사이트에 제안 된 툴체인을 다운로드하고 [www.cmake.org/Wiki/CMake_Cross_Compiling]에있는 크로스 컴파일 가이드를 사용하여 CMake 실행 파일을 만들었습니다. /usr/lib/libstdc++.so.6 : 버전`GLIBCXX_3.4.14

# This one is important 
SET(CMAKE_SYSTEM_NAME Linux) 

# Specify the cross compiler 
SET(CMAKE_C_COMPILER /pathto/crosstool-linux-gcc-4.5.2-gclibc-2.9-oabi/arm-unknown-linux-gnu/bin/arm-unknown-linux-gnu-gcc) 
SET(CMAKE_CXX_COMPILER /pathto/crosstool-linux-gcc-4.5.2-gclibc-2.9-oabi/arm-unknown-linux-gnu/bin/arm-unknown-linux-gnu-g++) 

# Where is the target environment 
SET(CMAKE_FIND_ROOT_PATH /pathto/crosstool-linux-gcc-4.5.2-gclibc-2.9-oabi/arm-unknown-linux-gnu /pathto/crosstool-linux-gcc-4.5.2-gclibc-2.9-oabi/arm-unknown-linux-gnu/arm-unknown-linux-gnu) 

# Search for programs in the build host directories 
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) 

# For libraries and headers in the target directories 
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) 
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) 

그러나, 리눅스 박스에 바이너리의 사용은 오류를

cmake를 제공합니다 : 여기 내 툴체인 파일입니다 '을 (를) 찾을 수 없습니다 (cmake에 의해 요구되는) 물론 충분히

는 라이브러리가되지 않습니다 :

prompt# strings /usr/lib/libstdc++.so.6 | grep GLIBC 
GLIBCXX_3.4 
GLIBCXX_3.4.1 
GLIBCXX_3.4.2 
GLIBCXX_3.4.3 
GLIBCXX_3.4.4 
GLIBCXX_3.4.5 
GLIBCXX_3.4.6 
GLIBCXX_3.4.7 
GLIBCXX_3.4.8 
GLIBCXX_3.4.9 
GLIBCXX_3.4.10 
GLIBC_2.3 
GLIBC_2.0 
GLIBC_2.3.2 
GLIBC_2.1 
GLIBC_2.1.3 
GLIBC_2.2 
GLIBCXX_FORCE_NEW 
GLIBCXX_DEBUG_MESSAGE_LENGTH 

이전에 크로스 컴파일 한 적이 없지만 호스트 시스템에서 glibcxx의 상위 버전에 대한 링크로 작성된 바이너리 또는 제조업체의 툴 체인이 이미지보다 현대식 인 두 가지 시나리오 중 하나를 볼 수 있습니다. 어떤 일이 일어나고 있는지 또는 내가 알지 못하는 다른 일이 있는지 확인하는 방법을 모르겠습니다.

나의 마지막 노력은 정적 잘하면 내가 빌드 오류를 가지고

cmake -DCMAKE_TOOLCHAIN_FILE=../toolchain-technologic.cmake -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_EXE_LINKER_FLAGS_RELEASE="-static" .. 

로 연결 오류 없애 CMake를 크로스 컴파일하려고 참여, 그리고 바이너리 중 하나가 작동하지 않았다. 내가 가지고 :

FATAL: kernel too old 
Segmentation fault 

나는 리눅스 박스에 glibcxx 3.4.14를 설치하려고 할 것입니다,하지만이 프로세서를 사용할 수처럼은 보이지 않는다.

CMake 종속성 또는 시스템 요구 사항을 검색해 본 결과 아무 것도 찾을 수 없습니다. 나는 또한 CMake를 만드는 방법을 조사했지만 대부분의 검색은 CMake 자체를 구축하는 것보다 CMake로 빌드하는 방법을 보여줍니다.

답변

3

나는 CMake를 사용하여 ARM9 장치에 대해 많은 크로스 컴파일을 수행하며 실제로 대상 장치에있는 동일한 라이브러리에 연결하지 않는 것처럼 보입니다.버전 2.6 이후의 크로스 컴파일을 잘 지원하므로 CMake를 직접 빌드하지 않아도됩니다. CMAKE_FIND_ROOT_PATH 변수를 대상 장치에있는 루트 파일 시스템의 정확한 복사본 (대상 프로세서에 대해 사전 컴파일 된 라이브러리 및 바이너리 포함)이있는 경로로 설정하십시오. 그것은 당신의 문제를 해결해야합니다.

사이드로드로, 저는 크로스 컴파일러를 빌드 할 때 crosstool-ng을 사용하고 싶습니다. 처음부터 새로 빌드하는 데 도움이되는 정말 멋진 도구입니다. 그래서 컴파일러 버전과 glibc를 원래 루트 파일 시스템을 만드는 데 사용했던 것과 일치 시키려고합니다. (보통 ARMedslack에서 준비된 루트 파일 시스템으로 시작합니다. 내 개발 상자에는 Slackware를 사용하고 ARM 타겟에는 ARMedslack을 사용하십시오.)

+1

cmake는 교차 플랫폼 컴파일을 지원하지 않습니다. 대상 플랫폼에서 자동 구성 테스트 용 바이너리를 실행할 수있는 지원이 포함되어 있지 않은 것 같습니다. 내가 잘못? – schily