크로스 컴파일 및 CMake

크로스 컴파일 및 CMake

크로스컴파일을 하려고 하는데CGALamd64 Linux 시스템에서 ARM 아키텍처로 마이그레이션합니다. CGAL 목적CMake건설에 사용됩니다.

CGAL에는 다음을 포함한 여러 가지 종속성이 있습니다.좋은 제조 관행그리고MPFR도서관. CMake가 실행되면 이러한 종속성의 버전을 확인해야 합니다. 버전을 찾기 위해 CMake는 이러한 라이브러리에 간단히 연결하고 해당 버전을 출력하는 몇 가지 작은 테스트 프로그램을 컴파일하고 실행합니다. 이는 크로스 컴파일되지 않은 일반적인 빌드 프로세스 중에 제대로 작동합니다.

하지만 크로스 컴파일을 하면 이러한 테스트 프로그램은 자연스럽게 호스트 시스템에서 실행되지 않습니다. 예는 다음과 같습니다.

/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
/opt/Company/ArmTools_GCC435_GLIBC_Q3_2011/bin/arm-rc-linux-gnueabi-g++        -fPIC CMakeFiles/cmTryCompileExec.dir/print_GMP_version.cpp.o  -o cmTryCompileExec -rdynamic /home/pmw/Software-Engineering/build/Lib/mpir-2.6.0/arm/lib/libgmp.a
gmake[1]: Leaving directory `/home/pmw/Software-Engineering/SW_Tools/CGAL-4.1/CMakeFiles/CMakeTmp'
/home/pmw/Software-Engineering/SW_Tools/CGAL-4.1/CMakeFiles/CMakeTmp/cmTryCompileExec: /home/pmw/Software-Engineering/SW_Tools/CGAL-4.1/CMakeFiles/CMakeTmp/cmTryCompileExec: cannot execute binary file

-- USING GMP_VERSION = 'unknown'

내가 찾은제안(제가 올바르게 이해한 경우) GMP 버전을 명시적으로 지정하면 CMake가 이를 확인하려고 시도하여 실패하는 것을 방지할 수 있습니다. 그래서 다음 줄을 포함하는 파일을 만들었습니다.

SET(GMP_VERSION 2.6.0)

매개변수를 사용하여 CMake를 호출합니다 -C path/to/my/file. 그러나 그것은 아무것도 바꾸지 않습니다. 그런 다음 매개변수를 사용하여 CMake를 호출하려고 합니다 -DCMAKE_TOOLCHAIN_FILE=/path/to/my/file. 다시 말하지만 효과가 없습니다. 그러나 CMake가 파일을 찾아 구문 분석할 수 있다는 것을 발견했습니다.

그렇다면 CMake가 호스트 시스템에서 크로스 컴파일된 프로그램을 빌드하고 실행하지 않도록 어떻게 설득할 수 있습니까?

이 Unix 및 Linux StackExchange 사이트가 이 질문을 해결하기에 가장 좋은 장소가 아니라면 미리 사과드립니다. 지난주CGAL 메일링 리스트에 내 질문을 게시했습니다.(이제 "cross-compile cgal"에 대한 Google 검색 결과 상위 3위 안에 들었습니다. 저는 유명해졌습니다!) 그러나 아무런 응답도 받지 못했습니다.

답변1

구경하다CMake 위키CMAKE_CROSSCOMPILING, 변수와 CMake의 캐싱(모두 위키에 설명되어 있음)을 약간 수정해야 한다고 생각합니다 .

관련 정보