2012-09-23 5 views
5

두 버전의 내 앱이 포함 된 Mac OS X 용 유니버설 바이너리를 만들 수 있습니까? 하나는 SSE4.2로 컴파일되고 다른 하나는 SSE3으로 컴파일 된 것입니까?다른 SSE 버전의 유니버셜 바이너리

이 경우 SSE4.2를 지원하는 CPU에 대해 SSE4.2로 컴파일 된 버전이 자동으로로드됩니다.

아니요, 그렇다면 SSE4.2를 지원하지 않지만이를 지원하는 CPU에서 SSE4.2를 사용하는 오래된 CPU에서 내 앱을 실행하라는 제안을 받고 싶습니다.

Mac AppStore를 대상으로합니다. Xcode 4.5에서 Clang을 사용합니다.

+0

당신이해야 할 일은 : 1) 명령어 세트를 감지하십시오. 2) 원하는 버전으로 분기하십시오. – Mysticial

+0

[내 대답은 여기에 명령 집합을 감지하는 방법을 보여줍니다.] (http://stackoverflow.com/a/7495023/922184)'__cpuid()'내장 함수는 MSVC에만 해당됩니다. GCC에서는 인라인 어셈블리를 사용하여 액세스 할 수 있습니다. 나는 당신이 무엇을 사용하고 있는지 잘 모르겠지만 그것을 접근 할 수있는 방법이 있어야합니다. – Mysticial

+0

이전 CPU에서 실행되지 않는 일부 줄이 타사 오픈 소스 프로젝트에서 나왔으므로 소스 코드 파일을 변경하지 않는 것이 좋습니다. –

답변

3

이 형식은 Mac OS X에서 사용되는 Mach-O 형식에서 지원되지 않습니다.이 형식을 사용하면 다른 아키텍처의 이진 파일을 사용할 수 있습니다. 하위 유형 필드가 있지만 다른 세대의 프로세서에 대해 정의 된 값만 있으며 해당 기능은 없습니다.

이 문제를 해결하는 데는 몇 가지 방법이 있습니다. 하나는 SSE4.2와 다른 함수 이름을 사용하여 동일한 바이너리에 빌드 된 구형 프로세서 용 코드를 모두 갖는 것입니다. 코드는 SSE4.2가 지원되는지 여부를 결정한 다음 적절한 함수를 호출합니다.

또 다른 옵션은 두 개의 라이브러리 (SSE4.2와 하나가없는 라이브러리)를 만들고 응용 프로그램 번들에 둘 다 제공하지만 링크하지 않을 것입니다. 처음로드 될 때 코드는 SSE4.2가 지원되는지 여부를 결정한 다음 올바른 라이브러리를로드합니다.

첫 번째 방법을 사용하면 라이브러리를로드하고 모든 함수를 연결하는 것에 대해 걱정할 필요가 없지만 실행되지 않는 추가 코드를 항상로드하므로 각 변수를 먼저 확인해야합니다 이러한 함수 호출 중. 두 번째 방법을 사용하면 매번 아무 것도 확인하지 않고 함수를 호출 할 수 있지만 라이브러리를로드하고 모든 함수를 연결하면 매번 변수를 단순히 비교하는 것보다 많은 작업이 수행됩니다.