나는 겪고 있다처음부터 리눅스 11.0 책. 존재하다삼. LFS 크로스 툴체인 및 스테이징 도구 구축, ii. 도구 체인 기술 설명, 캐나다 크로스 컴파일에 대해 조금 설명합니다. 최종 결과를 얻기 위해 왜 3단계와 3대의 기계가 필요한지 이해가 되지 않습니다. 텍스트 컴퓨터 A와 A에서 실행되고 A에 대한 바이너리를 생성하는 컴파일러로 시작한다고 가정합니다. 그렇다면 C에서 실행되고 C용 바이너리를 빌드하는 컴파일러를 빌드하는 데 해당 컴파일러를 사용하면 어떨까요? 먼저 A에서 실행되지만 B용으로 빌드된 컴파일러를 빌드하고, B에서 실행되지만 C용으로 빌드된 컴파일러를 빌드하고, 마지막으로 C에서 실행되고 C용으로 빌드된 컴파일러를 빌드하는 등 많은 어려움을 겪을 이유가 무엇입니까?
Wikipedia에서도 이에 관한 기사를 찾았습니다.https://en.wikipedia.org/wiki/Cross_compiler.
답변1
설명된 장면은 이렇습니다
- 머신 A는 느리고 컴파일러가 있습니다.
- 머신 B는 빠르지만 컴파일러가 없습니다.
- 머신 C가 대상이지만 느리고 컴파일러가 없습니다.
A에서 C의 모든 바이너리를 빌드할 수 있지만 머신 A가 느리기 때문에 시간이 오래 걸립니다.
저자는 A에서 B의 컴파일러를 크로스 컴파일하는 데 약간의 시간을 할애하는 것이 가치가 있다고 믿습니다. 그런 다음 빠른 시스템 B를 사용하여 느린 시스템 C에 필요한 모든 바이너리를 교차 컴파일함으로써 A 또는 C에서의 컴파일을 방지함으로써 전체 시간을 줄일 수 있습니다.
마지막 단계는 C 기반의 C용 컴파일러를 구축하고 시스템 B에 대한 종속성을 제거하는 것입니다. 속도는 매우 느리지만 이제 Machine C는 가끔 프로그램 자체를 직접 컴파일할 수 있습니다.
답변2
첫째, 컴퓨터 C는 실제로 컴파일할 수 있는 것이 아닙니다. 임베디드 장치일 수도 있고 컴파일을 위해 설정하고 싶지 않은 프로덕션 머신일 수도 있습니다.
그래서 당신은 그런 "nix" 기계를 가지고 있습니다. 크로스컴파일할 수 있어야 합니다.
당신이 가지고 있는 것은 빌드 머신입니다. B입니다. 충분히 빠르고 강력한 기계였지만 컴파일러가 없었습니다. C용은 고사하고 B용으로 만들어진 컴파일러도 없습니다. C용 항목을 작성하는 데 이를 사용하고 싶습니다.
어떻게 얻나요? 글쎄, 당신은 B 컴파일러, 바람직하게는 C로 직접 크로스 컴파일하는 사람과 이야기합니다. 그런 다음 이를 B로 다운로드하여 사용자 정의 시스템에 맞게 C를 크로스 컴파일하는 데 사용합니다.
B용 컴파일러는 어디서 구했습니까? 그들의 시스템은 B의 시스템과 다를 가능성이 높습니다. 어떻게 시작하나요?
그들에게 정말로 필요한 것은 시스템 A와 A용 프로그램을 컴파일하는 컴파일러입니다.
이제 A에 설치된 이 컴파일러는 크로스 컴파일러를 빌드하지 못할 수 있습니다. 이는 단지 특정 언어에 대한 컴파일러일 뿐입니다(예:씨)은 공급업체 또는 기타 제품에서 제공됩니다.
필요한 것은 B용 바이너리를 컴파일할 수 있는 크로스 컴파일러입니다. 이렇게 하려면 먼저 A-to-A 컴파일러("공급업체" 컴파일러)를 사용하고 B로의 크로스 컴파일을 지원하는 컴파일러를 컴파일합니다.
다음으로 당신은저것그런 다음 B에서 C로 컴파일하는 크로스 컴파일러를 컴파일하도록 요청합니다.
그럼 당신이 배포저것컴퓨터 B와 C를 사용하는 사람들을 위한 B-C 컴파일러.
...
이제 이것은 실제 문제입니다. 공급업체의 컴파일러가 설치된 Microsoft Windows 컴퓨터, Solaris Unix 컴퓨터 또는 macOS 컴퓨터가 있습니다. 모든 경우에 쉽게 컴파일러를 얻을 수 있지만 크로스 컴파일러는 얻을 수 없습니다. 이러한 공급업체는 크로스 컴파일러를 제공하는 데 거의 관심이 없습니다.
도구를 제공하는 모든 사람이 갖고 있는 컴퓨터(B 및 C)가 없습니다. 따라서 "잠긴" 시스템 A에서 부팅하여 사용자가 다운로드할 수 있도록 사전 구축된 전체 도구 세트를 구축하고 배포할 수 있습니다.
"하드" 요구 사항은 컴퓨터 A에 B에서 C로 크로스 컴파일러를 컴파일할 수 있는 컴파일러가 있다는 것입니다. 컴파일러의 실행 명령어 세트와 컴파일러의 대상 명령어 세트는 모두 A에 외부입니다.
답변3
엠마 루오의 답변LFS에서 제안하는 논리를 설명합니다. 나는 LFS가 3방향 "Canadian Cross" 편집에 대해 좋은 설명을 제공한다고 믿지 않습니다.
머신 A가 머신 C용으로 컴파일하는 머신 B용 컴파일러를 생성한다고 가정합니다.
기계 C의 한계로 인해 B와 C는 일반적으로 다릅니다(예). 예를 들어 개발자가 머신 C용 코드를 컴파일하고 싶지만 C의 기능은 매우 제한적일 수 있습니다.소규모 컴퓨터 회사또는 임베디드 장치이며 CPU 및 메모리 제한으로 인해 자체 컴파일러를 쉽게 실행할 수 없습니다. 따라서 개발자는 C를 컴파일하기 위해 더 강력한 데스크톱(컴퓨터 B)을 사용합니다.
A와 B는 대부분 다르지만 리소스 제약으로 인한 것은 아닙니다. 더 일반적인 이유는 일반적으로 컴파일러 자체를 컴파일한 개발자가 최종 C 코드를 컴파일한 개발자와 다르기 때문입니다. 그들은 일반적으로 같은 조직에 속해 있지 않습니다.
예
우분투 패키지 받기gcc-arm-linux-gnueabihf. 이는 Ubuntu 핵심 개발자가 관리합니다. 다른 컴퓨터(예: AMD64 컴퓨터)에서 ARM 프로그램을 컴파일하려는 사람은 누구나 이 패키지를 다운로드할 수 있습니다. 즉, 누구나 B에 설치하여 C를 컴파일할 수 있으며 Ubuntu Core 개발자는 시스템의 B와 C를 제어할 수 없습니다.
Ubuntu Core 개발자는 이제 amd64, arm64 및 i386에서 실행되도록 gcc-arm-linux-gnueabihf를 컴파일합니다. 그들은 세 가지 버전을 모두 빌드하기 위해 세 개의 빌드 머신을 원하거나 필요하지 않습니다. 그 이유는 기계를할 수 있는머신 B와 C의 아키텍처는 다릅니다.