다음 2022 WWDC 영상을 보고 정리한 글 입니다.
https://developer.apple.com/videos/play/wwdc2022/110362/
Linking은 라이브러리나 프레임워크 같은 소스 코드 외의 다른 코드를 연결하여 빌드하는 작업이다. 링킹에는 두가지 타입이 있는데 다음과 같다.

전체 라이브러리 중 필요한 부분만 linking해서 사용함 - > 선택적 로딩


정적 라이브러리와 관련해서 빌드 속도를 높이는 법은?
링크 옵션 :
-all_load
정적 라이브러리를 모두 로딩하여 병렬적으로 링킹해서 속도를 높임
-dead_strip
링킹 불가능한 코드와 데이터를 제거함
-no_exported_symbols
수백만개의 심볼을 제거하면 2~3초가 줄어드는 효과를 본다.
하지만 xctest를 호스트로 사용하는 경우나 일부 앱 플러그인을 사용하는 경우 이 옵션을 사용할 수 없다.
-no_deduplicate
de-dup 최적화를 끈다. 중복을 찾는데 시간이 오래걸리는 알고리즘

build setting에서 other linker flags를 설정해주면 된다.
정적 라이브러리의 놀랄 점
빌드 된 모든 정적 라이브러리의 코드가 앱에 포함되지 않음 ( 중요하지 않다면)
dead-stripping은 누락된 심볼이나 중복된 심볼 에러를 억제하는 기능이 있음
정적 라이브러리를 실행 가능한 바이너리(dylibs)로 바꾸면서 동적 라이브러리가 시작됨. (90년대 초) DSO또는 DLL이라고 부르기도 함.

위와 같은 방식으로 동적 라이브러리는 프로그램 파일 크기에 포함되지 않으면서 사이즈를 제한할 수 있음. 또 컴파일 시 빌드 시간이 단축된다. 하지만 앱을 시작할 때 더 많은 프로그램을 로드해야하면서 시작 시간이 지연 된다.

동적 라이브러리의 장점은 가상메모리에서 여러 프로세스가 동일한 동적 라이브러리를 사용할 때 이를 공유할 수 있다.

하지만 동적 라이브러리를 연결할 때 또다른 링커가 필요한데 이것이 dyld이다.
-> 정적 라이브러리의 사용과 동적 라이브러리 사용의 중간에서 최적점을 찾아야한다.

