크로스 컴파일러를 사용하여 무언가를 컴파일하려면 어떻게 해야 합니까?

크로스 컴파일러를 사용하여 무언가를 컴파일하려면 어떻게 해야 합니까?

크로스 컴파일에 대해 배웠고 이를 만드는 방법에 대한 많은 정보를 찾았지만 사용 방법에 대한 정보는 거의 없었습니다.

bluez-utils-3.36도구 를 컴파일하고 싶습니다.이 웹사이트내 자신의 컴파일러를 사용하십시오. 크로스 컴파일러(arm-linux-gcc-4.4.3.tgz)를 찾았습니다.이 웹사이트. 내 gcc 버전은 4.4.3이므로 이것이 올바른 버전이라고 가정합니다.

호스트(코드를 작성하는 머신)

Processor: Intel(R) Xeon(R) CPU E5-2420 0 @ 1.90GHz
OS Version: Linux 2.6.32-44 generic

대상 머신: (컴파일된 파일이 실행되어야 하는 대상)

Processor: ARM926EJ-S rev 5 (v5l)
OS Version: Linux 2.6.35.3-571

이 새로운 컴파일러로 어떻게 컴파일합니까 bluez-utils-3.36?

답변1

컴파일러와 도구 체인의 다른 부분에는 GNU 표준 명명 체계가 있습니다.

<target triplet>-<tool name>

이것목표 삼중항이것은 형태입니다

<machine>-<vendor>-<operatingsystem>

도구 이름은 컴파일러의 이름이거나 또는 등 gcc의 다른 도구 이름 입니다 .ldstripar

기본 컴파일러, 즉 크로스 컴파일러가 아닌 네이티브 바이너리를 컴파일하는 컴파일러는 gcc트리플 없이 호출됩니다.

귀하의 질문에서 언급한 파일 내 컴파일러의 트리플은 다음과 같습니다 arm-none-linux-gnueabi(쿼드처럼 보이지만 그게 바로 그것입니다). 따라서 이를 사용하려면 arm-none-linux-gnueabi-gccNormal 대신 호출하면 됩니다 gcc.

를 사용하는 무언가를 빌드하는 경우 일반적 Makefile으로 일반 컴파일러 대신 실행하여 Makefile원하는 컴파일러를 사용할 수 있습니다. GNU 스크립트를 사용하여 무언가를 구축하는 경우,CC=arm-none-linux-gnueabi-gcc makemakeconfigure대상 삼중항을 지정할 수도 있습니다..

답변2

크로스 컴파일러 이상의 것이 필요합니다.도구 체인, 소스 코드에서 실행 파일을 가져오는 데 더 많은 단계가 필요하기 때문입니다. 이러한 단계는

  1. 컴파일(소스 코드를 어셈블러로)
  2. 조립(조립 코드에서 기계 코드로)
  3. 연결(기계어 코드의 루틴과 라이브러리가 서로 연결됨)

GNU 툴 체인의 명명 표준은 <target>-<tool>예를 들어 arm-oe-linux-gnueabi-gccARM 아키텍처용 컴파일러, Open Embedded Linux 변형 arm-oe-linux-gnueabi-as, 동일한 툴 체인의 어셈블러 등입니다.

그러나 이것이 호스트의 소스 코드에서 대상 컴퓨터의 실행 파일을 가져오는 데 필요한 전부는 아니며, 호스트의 대상 컴퓨터에서 헤더와 라이브러리를 가져오려면 링커도 필요합니다. 그렇기 때문에 "기호를 읽을 수 없습니다. 잘못된 파일 형식"이라는 빌드 오류가 발생합니다. 물론 헤더와 sysroot 및 모든 항목을 호스트에 복사한 후에는 호스트의 원본 변수가 아닌 올바른 변수를 찾기 위해 크로스 컴파일러에 대한 적절한 변수를 설정해야 합니다.

일반적으로 소스 코드 패키지에는 특정 컴파일러를 수용하도록 준비된 Makefile이 포함되어 있습니다. 이전 의견을 보면 CC= 변수를 사용하여 많은 문제를 해결한 것으로 보입니다. 모든 것이 설정되면 Makefile의 CC를 변경하고 make.

따라서 간단히 말해서 대상 컴퓨터에 대한 호스트 컴퓨터에 고유한 도구 체인을 구축하거나 이미 구축된 도구 체인을 가져와야 합니다.

행운을 빌고 재미있게 보내!

답변3

호스트는 크로스 컴파일하는 시스템입니다. 귀하의 개발 머신.
대상은 ARM926EJ-S 시스템입니다.
몇 가지 참고 사항:
ARM926EJ-S는 ARMv5입니다. 크로스 툴체인이 올바른 ARM 프로세서 버전에 맞게 컴파일되었는지 확인하세요.
make 파일에 요청된 설치 디렉토리:
INSTALL = /usr/bin/install -c
이것이 원하는 것이 아닌 호스트(개발) 시스템에 설치될 것이라고 생각합니다.
임베디드 장치용으로 이를 크로스 컴파일하는 경우 bluez를 설치하려면 "workingInstall" 디렉터리를 만들어야 합니다. 그런 다음 임베디드 파일 시스템에 추가하십시오. (낸드, SD 카드).

관련 정보