문제

OSX 10.6 스노우 레오파드에서 제공하는 GCC 컴파일러를 이해하는 데 어려움이 있습니다. 주로 64 비트 환경에 대한 경험이 부족하기 때문입니다.

$ cat >foo.c
main() {}
$ gcc foo.c -o foo
$ file foo
foo: Mach-O 64-bit executable x86_64
$ lipo -detailed_info foo
input file foo is not a fat file
Non-fat file: foo is architecture: x86_64

그러나 내 아키텍처는 Intel i386 유형으로 간주됩니다 (최신 Intel Core2 Duo MacBook 중 하나가 있습니다).

$ arch
i386

및 컴파일러는 i686-Apple-Darwin10을 대상으로합니다

$ gcc --version 
i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5646)

물론, 32 비트를 컴파일하면 32 비트 실행 파일을 얻습니다.

$ gcc -m32 foo.c -o foo
$ file foo
foo: Mach-O executable i386

그러나 나는 큰 그림을 얻지 못한다. 컴파일러의 기본 설정은 x86_64 실행 파일을 생성하는 것입니다. (내가 추측하더라도) 나는 32 비트 커널을 실행하고있다. I686-Apple-Darwin 플랫폼을 대상으로하는 컴파일러가 있더라도. 왜요? 그들은 어떻게 달릴 수 있습니까? 64 또는 32를 컴파일해야합니까?

이 질문은 Mac에서 GCC 4.2.3을 컴파일하려는 시도로 인한 것이지만, x86_64에 대해 GMP, MPFR 및 Libiberty Getting (경우에 따라)에 대해 많은 문제가 있습니다. 모든 것을 x86_64로 컴파일해야합니까? 그렇다면 대상은 무엇입니까 (I686-Apple-Darwin10이 아님)?

도와 주셔서 감사합니다

도움이 되었습니까?

해결책

Snow Leopard의 기본 컴파일러는 GCC4.2이고 기본 아키텍처는 X86_64입니다. Mac 소프트웨어를 구축하는 일반적인 방법은 별도의 패스로 여러 아키텍처를 구축 한 다음 Lipo를 사용하여 결과를 결합하는 것입니다. (Lipo는 단일 아키마 파일 만 다중 구조 파일로 컴파일하거나 멀티 아키 파일에서 아치를 스트립합니다. 발견 한대로 단일 아키아 파일에 유틸리티가 없습니다.)

컴파일러의 물린은 아무것도 관련이 없습니다. 64 비트 컴파일러로 32 비트 바이너리를 구축 할 수 있으며 그 반대도 마찬가지입니다. (컴파일러의 "대상"이라고 생각하는 것은 실제로 실행 파일입니다.)

커널의 물린은 아무것도 관련이 없습니다. 32 비트 커널에 부팅 할 때 64 비트 바이너리를 구축하고 실행할 수 있으며 그 반대도 마찬가지입니다.

중요한 것은 연결을위한 적절한 아키텍처가 있는지 링크 할 때입니다. 64 비트 바이너리에 32 비트 빌드를 연결하거나 그 반대도 마찬가지입니다. 따라서 중요한 것은 링크 라이브러리의 아키텍처가 무엇인지 확인하고, 일관성이 있는지 확인한 다음 동일한 아키텍처의 이진을 구축하여 라이브러리와 연결할 수 있도록하는 것입니다.

다른 팁

i686-Apple-Darwin10.0.0에는 대부분의 Autotools에서 이해되지 않는 X86_64 폴더가 포함되어 있습니다. 다시 말해, GCC 컴파일러는 불행히도 스노우 레오파드에 대한 농담에 부족한 것은 아니라고 말합니다. 32 비트와 64 비트 라이브러리를 i686-Apple-Darwin10.0.0에 묶는 이유는 저를 넘어선 것입니다.

$ ls /usr/lib/gcc
i686-apple-darwin10 powerpc-apple-darwin10

*86-를 볼 수 있도록 모든 autotools 구성 파일을 변경해야합니다.다윈 디렉토리와 64 비트 라이브러리를 찾고 있습니다.

귀하의 시스템과 마찬가지로, 내 MAC Mini는 64 비트 플랫폼을 사용하고 있지만 i386은 64 비트 하드웨어로 배포 된 이후로 다시 실수합니다.

$arch
i386

Apple Toolchains는 여러 아키텍처를 지원합니다. x86 및 x86_64 코드가 포함 된 지방 바이너리를 만들려면 매개 변수를 전달해야합니다. -arch i386 -arch x86_64 GCC에. 컴파일러는 한 번에 두 플랫폼 모두에 대해 코드를 두 번 컴파일합니다.

첨가 -arch i386 -arch x86_64 CFLAG를 사용하면 GMP, MPFR 및 여러 아치를 한 번에 컴파일 할 수 있습니다. 그런 식으로 libusb를 구축하는 것이 저에게 효과적이었습니다.

이 대답은 잘못되었지만 아래의 의견을 참조하십시오

진짜 질문은 ... 어떻게 32 비트 버전의 OSX를 얻었습니까? 나는 그 눈 표범을 몰랐다 가졌다 Apple의 모든 Intel 칩은 Core 2 또는 Xeon이므로 X86_64 아키텍처를 지원하는 32 비트 버전입니다.

아, 그리고 스노우 레오파드는 인텔 칩에서만 작동합니다.

편집 : 분명히 스노우 레오파드는 32 비트 모드로 시작합니다.

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