-all_load 링커 플래그는 무엇을합니까?


123

Objective-C 코드를 컴파일 할 때 -all_load 플래그가 수행하는 작업을 어디에서도 찾을 수 없습니다.

바이너리를 Apple에 업로드하는 데 몇 가지 문제가 있습니다. 그들은이 플래그를 사용하지 않았기 때문이라고 말하지만 코드 없이도 컴파일됩니다.

누군가 나를 도울 수 있습니까?

감사


2
일반적으로 이와 함께 표시되는 오류는 애플리케이션을 실행할 때 장치에서 발생합니다. Apple의 검토를 위해 제출하기 전에 실제 하드웨어에서 애플리케이션을 테스트하지 않았다는 말입니까? 그렇다면 그것은 매우, 아주 나쁜 생각입니다.
Brad Larson

나는 그것을 테스트했지만, 내 "배포"구성 (앱 스토어 프로비저닝 프로파일이있는 것)에는 플래그가 없었고 모든 테스트는 플래그가있는 개발 프로파일을 사용하여 수행되었으므로 모든 것이 정상인 것 같습니다. 배포 프로필을 사용하여 앱 스토어 용으로 컴파일했는데 플래그가 꺼져 있었고 배포 프로필을 로컬로 설치할 수 없기 때문에 확인할 수 없었습니다.
Guy Ephraim

답변:


144

이 기술 노트 https://developer.apple.com/library/content/qa/qa1490/_index.html 과 관련이있을 수 있습니다.

중요 : 64 비트 및 iPhone OS 응용 프로그램의 경우 -ObjC가 범주 만 포함하고 클래스가없는 정적 라이브러리에서 개체 파일을로드하지 못하도록하는 링커 버그가 있습니다. 해결 방법은 -all_load 또는 -force_load 플래그를 사용하는 것입니다. -all_load는 링커가 Objective-C 코드가없는 아카이브를 포함하여 모든 아카이브에서 모든 오브젝트 파일을로드하도록합니다. -force_load는 Xcode 3.2 이상에서 사용할 수 있습니다. 아카이브로드를보다 세밀하게 제어 할 수 있습니다. 각 -force_load 옵션 뒤에 아카이브 경로가 와야하며 해당 아카이브의 모든 개체 파일이로드됩니다.


3
예, 이것은 주로 iPhone 용 정적 라이브러리와 함께 작동합니다. 이 링커 플래그없이 컴파일 된 경우 카테고리는 빌드 된 바이너리에 포함되지 않으며 이러한 정적 라이브러리를 사용하는 모든 애플리케이션은 iPhone OS 하드웨어에서 실행될 때 런타임 오류가 발생합니다.
Brad Larson

1
컴파일 타임에 누락 된 메서드에 대한 경고 나 오류가 발생하지 않아야합니까?
Guy Ephraim

18
아니요, 범주는 컴파일 타임에 존재하기 때문에 최종 바이너리에 연결되지 않을뿐입니다. 그러나 Obj-C 디스패치의 동적 특성으로 인해 링커는 호출 코드를 구현 메서드로 직접 지정하지 않으므로 누락 된 것을 알 수 없습니다. 그런 다음 런타임에 "-performSelector :"를 사용하여 호출 한 것과 동일한 kaboom을 얻습니다.
Sophistifunk

14
기술 노트를 명확히하고 싶을뿐입니다. 대부분의 경우 -all_load가 아닌 -ObjC 링커 플래그가 필요합니다. -all_load는 클래스가없고 카테고리 만있는 라이브러리가있는 (드문 경우라고 가정합니다) 인스턴스에서 권장됩니다.
Chris Hill

3
stackoverflow.com/a/2615407/62 에 따르면 이것은 XCode 4.2에서 수정되었으므로 더 이상 -all_load 또는 -force_load 플래그가 필요하지 않습니다. 여전히 -ObjC가 필요합니다.
Liron Yahdav 2014
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.