프로젝트에 새로 프레임워크를 추가 시에 Static/Dynamic 중 어느 쪽으로 추가할 지, Embed/Do Not Embed 중 어느 쪽을 선택할 지에 대해 생각해보기 위한 글입니다. (해당 글의 번역이 주된 내용입니다.)

Static Library VS Dynamic Library

둘의 주요 차이점은 각각이 실행 파일(executable file)에 연결되는 방식이다.

Dynamic Library는 이름과 같이 애플리케이션에 동적(Dynamic)으로 연결되며, 애플리케이션 실행 파일의 일부가 아니다. 이는 앱이 런타임에서 그것들을 모두 로드한다는 것을 의미한다. 그러나 런타임에서 로드 시 프로젝트에 많은 Dynamic Library를 추가하고 전체 또는 대부분의 초기 단계에서 로드되는 것은 문제가 될 수 있다. 그렇기 때문에 앱 내에 많은 Dynamic Library를 두는 것은 좋은 생각이 아니다.

Dynamic Library의 프로세스는 다음과 같다:

앱이 실행(launched)되면 코드가 먼저 타겟 주소 공간에 로드된다. 그러면 dynamic linker가 작동하여 앱이 적절히 동작하기 위해 필요한 모든 것을 연결해준다. Dynamic linker는 install name을 기반으로 파일 시스템의 각 종속성 위치를 확인한 다음 정의되지 않은 외부 기호(external symbols)(이 경우에는 사용 중인 코드)를 앱에 연결한다.

반면에 Static Library는:

링크 시에 static linker를 사용한다. 이는 빌드 시 이런 라이브러리를 사용할 때 링커가 모든 프레임워크 코드와 타겟 애플리케이션 코드를 하나의 단일 실행 파일에 병합한다는 것을 의미한다. 이렇게 하면 최종 실행 파일은 더 커지지만 실행에 필요한 모든 코드를 이미 사용할 준비가 되었다는 것을 보장할 수 있다.(안정적) 애플리케이션이 실행되면 모든 애플리케이션 코드와 프레임워크 코드가 애플리케이션 주소 공간에 로드된다.

코테-52 2.jpg