Binary가 UNIX (Solaris/HPUX/Linux)에서 실행할 수 있도록 Windows에서 C 코드를 교차 컴파일하려면 어떻게합니까?

StackOverflow https://stackoverflow.com/questions/579695

문제

나는 조사했다 Cygwin/mingw/LCC 그리고 나는 창문에서 Perl Native C 확장을 컴파일 할 수 있기를 좋아하고 (바람직하게는 Cygwin에서) 더 이상 소란없이 Solaris 및 HP Unix에서 실행할 수 있는가?

이것은 모두 내 원래 Perl Cross-Platform 질문에서 비롯됩니다 여기.

도움이 되었습니까?

해결책

크로스 컴파일러는 설정하고 올바르게 작동하기가 매우 어렵습니다.

NetBSD의 사람들은 크로스 컴파일을하기 위해 엄청난 양의 작업을해야하며 동일한 OS, 다른 아키텍처를 실행해야한다고 생각합니다.

적어도 모든 헤더를 다른 OSS에서 Windows로 복사하고 대상 OS/아키텍처를위한 크로스 컴파일러, 링커 등을 가져와야합니다.

또한 불가능할 수도 있습니다. PERL 및 공유 라이브러리는 Windows에서 전혀 사용할 수없는 기본/비 GCC 컴파일러로 컴파일 될 수 있습니다.

다른 팁

(이것은 매우 오래된 질문이지만 유용한 정보를 놓치고 있습니다. 개인적으로 Solaris (SPARC & x86), AIX, HP-UX 및 Linux (x86, x64)를 위해이 작업을 수행했습니다.)

  • C ++ 크로스 컴파일받는 것은 직선 C보다 훨씬 어렵습니다.

  • HP-ux 32 비트 PA-RISC는 ELF 대신 SOM 형식을 사용하고 Binutils는 SOM을 지원하지 않기 때문에 지원되지 않습니다. 다시 말해, 64 비트 PA-Risc 만 크로스 컴파일 할 수 있습니다. (PA-RISC 2.0 칩이 필요합니다.)

  • 가능하다면 Cygwin 대신 Mingw와 함께 갈 것입니다. Cygwin은 문제가 될 수있는 많은 파일 권한 두통 및 cygwin1.dll 종속성을 소개합니다. 그러나 가능하면 Linux를 구축하십시오. 실행중인 모든 도구와 스크립트가 환경을 위해 설계 되었기 때문에 모든 것이 훨씬 빠릅니다. exec 그리고 stat 빠른 작업입니다. Windows + NTFS는 그 환경이 아닙니다.

  • Crosstools 스크립트부터 시작하지만 쓸 준비를하십시오. 많은 이것에 대한 시간.

  • 최신 GCC/Binutuils를 먼저 사용해보십시오. 그러나 문제를 극복 할 수없는 경우 오래된 패키지로 돌아가십시오. EG for power3 (AIX) GCC 4.X 시리즈 크로스 컴파일러는 불량 코드를 생성하며 3.x는 괜찮습니다.

  • 네이티브 리브와 헤더를 복사 할 때 가장 오래된 기계에서 복사 할 가능성이 있는지 확인하십시오. 새 LIBC를 복사한다는 것은 코드가 이전 LIBC의 모든 컴퓨터에서 실행되지 않음을 의미합니다.

  • 기본 Libs 및 헤더를 복사 할 때 'tar -h'가 Symlinks를 실제 파일로 전환하려고 할 것입니다. 또한 Solaris에서 필요한 CRT 객체 파일이 /usr /lib 미만이 아닌 CC 디렉토리에 묻혀 있습니다.

나는 동의한다 더글러스, 크로스 컴파일러를 얻고 작동하는 것은 매우 어렵습니다. 이것은 일반적으로 최후의 수단을 선택합니다. 부팅 스트래핑 또는 내장 장치 용 바이너리를 만드는 경우 종종 크로스 컴파일이 유일한 옵션입니다. 크로스 컴파일을 고려하기 전에 Cygwin에서 자신의 GCC를 컴파일하는 것이 편안해야합니다. 컴파일을 건너려면 Windows 아래에서 실행하려면 GCC를 구축해야하지만 실행 플랫폼을위한 바이너리를 생성해야합니다. 이 작업을위한 샘플 지침을 찾을 수 있습니다 여기.

아마도 루트가 없거나 대상 플랫폼에서 컴파일 할 수 없기 때문에 컴파일을 교차하고 싶을 것입니다. 예를 들어, Redhat Linux를 실행하는 호스팅 제공 업체가있었습니다. Perl CGI 스크립트와 관련 모듈을 실행할 수 있었지만 대상 기계에서 컴파일 할 수 없었으며 제작 한 라이브러리는 내 디렉토리에 존재해야했습니다.

이것을 해결하기 위해, 나는 대상 플랫폼을 위해 컴파일을 건너려고 시도했지만 대신 Windows의 VM 내부에서 유사한 호스트를 설정하기로 결정했습니다. Cygwin 내에서 SSH가 VM에있는 스크립트를 만들고 소스를 복사하며 전체 구성/빌드를 수행 할 수 있습니다. 마지막 단계는 바이너리 아티팩트를 호스팅 시스템에 배치하는 것이 었습니다.

Solaris 10과 Open Solaris가 Windows의 VM 내에서 실행되었습니다. 불행히도 VM에서 HPUX를 실행하는 데 어려움이있을 수 있습니다.

"Grand Unified Builder"를 읽지 않겠습니까?http://lilypond.org/gub/ 그리고 http://valentin.villenave.info/the-lilypond-report-11 (섹션 #4))

어떻게 작동하는지 모르겠지만 GUB를 사용하면 LilyPond 개발자가 Linux 상자에서 약 11 개의 플랫폼을 컴파일 할 수 있습니다.

Windows에서 컴파일 한 다음 Wine을 사용하여 Wine을 사용하여 모든 *NIX에서 실행하십시오. 대부분의 시간에 잘 작동합니다.

아니요, 이것은 이진 수준에서는 불가능합니다. 다양한 OS와 CPU 사이에는 이진 수준에서 많은 차이가 있습니다.

그러나 당신이 할 수있는 일은 C 확장 소스를 호환하여 다른 플랫폼으로 컴파일 할 수 있도록하는 것입니다. C는 "휴대용 어셈블리 언어"로 설계되었습니다. 크로스 플랫폼 인 루틴을 고수하는 한 일반적으로 동일하게 작동합니다. 특정 플랫폼에 존재하는 버그가있을 수 있으므로 여전히 테스트해야합니다.

이것은 할 수 없습니다 ... 그러나 Solaris 또는 HP에 따라 코드를 다시 컴파일하는 것은 번거 로움입니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top