Windows에서 Visual C ++ 컴파일러가 Linux 바이너리 실행 파일을 생성하기 어려운 이유는 무엇입니까?
마이크로 소프트 측에서는 그렇게하지 않으려는 것 외에는 전혀 아무것도 없다. 장애물은 기술적이지 않습니다.
개발 툴체인은 입력을 받고 출력을 생성하는 프로그램입니다. Visual C ++는 x86 어셈블리를 생성 한 다음 어셈블러를 사용하여 COFF 개체 파일로 변환합니다. Microsoft가 대신 ELF를 생성하게하려면 코드 일뿐입니다. 어셈블리가 들어오고 ELF가 나옵니다. 객체 파일이나 라이브러리에 대한 마술은 없습니다. 잘 이해 된 형식의 데이터 덩어리 일뿐입니다.
석기 시대로 거슬러 올라가면 크로스 컴파일은 훨씬 더 어려웠습니다. 왜냐하면 타겟 플랫폼의 툴 체인을 실행하는 플랫폼에 대한 어셈블리로 작성했을 것입니다. 즉, 세상에 VAX, M68K 및 Alpha 아키텍처 만 있으면 크로스 컴파일러 전체를 9 개씩 작성해야합니다. (VAX-to-VAX, VAX-to-M68K, VAX-to-Alpha, M68K-to-VAX, M68K-M68K 등) VAX 컴파일러의 일부를 재사용 할 수 있기 때문에 약간 과장된 것입니다. 각 대상의 코드 생성기에 연결 (예 : VAX, M68K 및 Alpha, 각각 VAX 용으로 작성)
C와 같은 특정 프로세서와 연결되지 않은 언어로 컴파일러를 작성하기 시작했을 때 그 문제는 사라졌습니다. 경로를 따라 가면 전체 툴체인을 C로 한 번 작성하고 로컬 플랫폼을 위해 작성했습니다 그것을 빌드하는 C 컴파일러. (종종 로컬 플랫폼의 컴파일러에서 부트 스트랩 된 후에 컴파일러를 사용하여 자체 재 컴파일하는 경우가 많지만, 또 다른 논의입니다.) 이것의 결과는 크로스 컴파일러를 빌드하는 것이 본질적으로 네이티브 컴파일러를 빌드하는 것과 같은 노력이되었다는 것입니다. 로컬 플랫폼. 유일한 차이점은 빌드 프로세스의 어딘가에서 로컬 플랫폼 용 코드 생성기 대신 대상 플랫폼 용 코드 생성기에서 컴파일하도록 지시 한 것입니다. 논리적 선택이었습니다.
컴파일러의 아키텍처가 발전함에 따라 제품에 모든 코드 생성기를 포함 및 빌드하고 런타임에 사용할 코드 생성기를 선택하는 것이 편리해졌습니다. Clang / LLVM 이이 작업을 수행하며 다른 것도 있습니다.
일단 작동하는 툴체인 (컴파일러, 어셈블러, 링커)이 있으면 라이브러리는 소스에서 빌드되고 결국 다른 플랫폼 용 실행 파일을 생성하는 데 필요한 모든 것을 얻게됩니다.