[ Xcode ] 스냅킷 no such file or directory 오류 해결 방법 feat. 동적, 정적 라이브러리

sonny·2024년 11월 13일
8

TIL

목록 보기
40/48

Xcode 코드베이스 강의를 듣다가 스냅킷을 설치하는 부분이 있었는데,

설치 후 import Snpkit 이라 쓰면 오류나고..

어찌저찌 타겟에 추가를 해서 빌드하면 ...

오류발생 오류발생

' no such file or directory ' <- 이 오류 때문에 빌드가 되지 않음...

아 정말 머냐구요 ㅜ

검색해도 내가 원하는 답이 나오지 않고 에러 해결방법을 여러 개 보고 하란대로 해봐도

모두 해결되지 않아 결국 튜터님에게 울면서 달려갔다.

후에에ㅐ앵 튜터니이임
.
.
.
.
.
해결 방법을 듣고 왔다.

설명 레고.

[ error ] no such file or directory 뿌셔보자

우선 스냅킷 설치부터 천천히 진행해보자.

설치는 프로젝트에서 하던 타겟에서 하던 상관 없었다.

사실 강의에서는 타겟으로 들어가 설치하는 방법을 알려주었지만 하고 싶은걸로 하면 된다.

여기서 잠시 의미를 짚고 넘어가자면!! (숙제다.)


Project와 Target의 의미

Project는 Xcode에서 앱이나 라이브러리의 전체 구조를 의미한다.

프로젝트에는 여러 개의 타겟과 설정파일이 포함되고,

프로젝트 설정에서 전반적인 빌드나 코드서명, 패키지 등을 관리할 수 있다고 한다.

Target은 프로젝트 내에서 빌드하고 실행할 단위이다.

앱이나 테스트, 위젯 등 여러 종류가 있을 수 있는데,

각 타겟은 독립적인 실행 파일을 생성할 수도 있고,

설정에 따라 앱의 구성 요소나 테스트 용도로 나누어 관리가 된다고 한다.

  • Project: 앱이나 라이브러리의 전체 구조와 설정을 관리하는 상위 단위.
  • Target: 프로젝트 내에서 빌드하고 실행할 개별적인 구성 요소(앱, 테스트 등).

.
.

아무튼 다시 돌아가 설치를 해볼건데,

난 프로젝트에서 패키지를 설치하려한다.

package Dependencies(패키지 종속성) 카테고리에서 패키지 추가를 위해 플러스 버튼을 눌러준다.

아 그리고 그 전에 미리 스냅킷 깃헙의 코드 주소를 복사해놓아야하는데,

링크를 남겨 놓겠다 -> 스냅킷 깃허브 페이지

이렇게 주소를 복사해준 뒤,

아까 + 를 눌러서 나온 창에 붙여넣고 add package를 눌러준다.

Add to Target (타겟에 패키지 추가하기)

라이브러리를 추가할 때 Xcode는 어느 타겟에 설치할지 이렇게 묻는다.

SnapKit과 같은 패키지를 특정 타겟에 추가해야 해당 타겟에서 라이브러리를 사용할 수 있다.

타겟마다 별도의 설정을 둘 수 있는데,

만약 앱 타겟에서는 SnapKit을 사용하지만 테스트 타겟에서는 사용하지 않도록 설정할 수 있다.

우선 여기서도 별도로 건드리지 않고 다시 add package 클릭!

설치가 완료되면 이렇게 왼쪽에 설치한 스냅킷이 확인되고 프로젝트안에 패키지에도 설치가 된 걸로 나온다.

자 그럼 바로 import snpkit 을 해주러 가보자

패키도 설치했는데 왜 피가 날까.

그건 바로 설치만 하고 타겟에 설정해주지 않았기 때문이다.

자 아까 봤던 부분에서 타겟으로 넘어가면,

상단의 Frameworks, Libraries, and Embedded Content 으로 이동하면 각 타겟에 포함된 패키지와 라이브러리 목록을 확인할 수 있다!

여기에 아까 다운받았던 스냅킷 패키지를 추가하거나 제거해야하는데,

나는 현재 추가되어있지 않아서 오류가 발생한 것이다.

저기서 + 를 눌러보면,

이 창이 뜨고 add 할 패키지를 고르라고 한다.

여기서 나는 두개 모두 스냅킷이니 두개 모두 추가해주었다.

아! 그리고 혹시라도 다른 패키지를 추가하고 싶다면 마찬가지로

여기서 원하는 패키지를 add 해주면 된다.
.
.

아무튼 그렇게 두개의 스냅킷을 모두 추가해줬지만....

첫 내용처럼 저 오류가 발생한 것이다.

.
.
.

바로 해결 방법으로 넘어가자면,

해결 - 타겟 설정에서 Package 하나를 삭제하면 된다.

그냥 다이나믹 써있는 스냅킷만 지우면 해결 된다.

아니 다이나믹을 꼭 지우라기보단, 그냥 둘 중에 하나만 지우면 된다.

초 간 단.


저 오류가 발생하고 튜터님에게 설명을 들었는데,

튜터님께서 정적 라이브러리동적 라이브러리 가 있다고 말씀해주신 것이 있었다.

처음에 들었을 땐 " 패키지가 정적..동적.. 아.. 머지... " 라고 생각하고 있었는데

이 부분을 반드시 알고 넘어가야 된다고 당부하셔서 꼭 짚고 넘어간다..

.
.
.
.

정적 라이브러리와 동적 라이브러리

SnapKitSnapKit Dynamic이 동시에 설치되면서 빌드 오류가 발생한 이유는,

같은 패키지가 정적(static)동적(dynamic) 두 가지 버전으로 동시에 존재하면 중복 에러가 발생하기 때문이었다.

" 정적과 동적? 그게 뭔데 충돌이 나는거야? "

정적과 동적 라이브러리는 빌드하고 실행하는 방식이 달라서

같은 라이브러리의 정적/동적 버전을 동시에 사용하면 충돌이 발생할 수 있는 것이다.

여기서 두 라이브러리의 차이를 보자면,

정적 라이브러리 (Static Library)

  • 앱이 컴파일될 때 실행 파일에 포함 됨.
  • 앱이 실행 중에는 별도의 파일로 존재하지 않고, 컴파일 시 한 번 빌드에 통합되므로 속도가 빠름.
  • 대신 앱 실행 파일의 크기를 증가시킬 수 있음.

앱이 컵파일 될 때 실행파일에 포함된다는 말은 정적 라이브러리가 앱을 빌드할 때

앱의 코드와 함께 하나의 실행 파일로 통합 된다는 말이다.

이 과정에서 앱의 코드와 라이브러리 코드가 하나의 실행파일로 묶이고,

실행 중에는 별도로 라이브러리를 불러오지 않아도 된다는 뜻.

동적 라이브러리 (Dynamic Library)

  • 앱이 실행될 때 메모리에 로드 됨.
  • 런타임에 로드되므로 메모리 관리나 업데이트가 유연하고, 앱 실행 파일의 크기가 작아질 수 있음.
  • 시스템에서 여러 앱이 하나의 동적 라이브러리를 공유할 수 있지만, 로드 과정에서 약간의 런타임 오버헤드가 발생할 수 있음.

정적 라이브러리와 반대로 실행파일과 별도로 존재하기 때문에

앱이 실행될 때마다 라이브러리를 메모리에 로드해야한다.

그러니까, 앱 코드와 라이브러리 코드가 완전히 분리된 상태로 실행된다는 뜻이다.

그리고 파일의 크기를 증가시키기도, 혹은 감소시키기도 하는 이유의 요약이다.

  • 정적 라이브러리는 독립성과 빠른 속도를 위해 앱 파일 크기를 증가시킬 수 있지만, 외부 라이브러리에 의존하지 않음.
  • 동적 라이브러리는 메모리 효율과 유연성을 위해 앱 파일 크기를 줄일 수 있지만, 앱 실행 중에 외부 라이브러리를 로드해야 함.

그래서 왜 스냅킷과 스냅킷 다이나믹은 동시에 사용할 수 없는가?

정적과 동적 라이브러리는 내부적으로 동일한 이름과 심볼을 공유하기 때문에

동시에 로드되면 같은 코드나 심볼을 중복 정의하게 돼버린다.

이건 빌드 과정에서 충돌을 일으켜 아까처럼 컴파일 오류가 발생하게 되는 것이다.

따라서 SnapKit정적 버전동적 버전 중 하나만 선택해서 사용해야 한다.

어떤 앱에 어떤 라이브러리가 적합한지 간단하게 나눠보자면,

  • 정적 라이브러리 : 독립적이고 속도가 중요한 앱에 적합하다.
  • 동적 라이브러리 : 메모리 절약과 유연한 업데이트가 필요한 경우 적합하다.

음...

스냅킷을 설치하면서 발생한 오류 덕분에 정적 라이브러리와 동적 라이브러리가 어떻게 다른지 배우게 되었다.

빌드 및 실행 방식에서 차이가 나니, 선택에 따라 앱의 성능과 구조가 달라지는 부분도 알게 되었다.

그리고 패키지를 설치할 때, 어떤 타겟에 설치할 지 묻는 화면을 그냥 넘기면 안된다는 걸 깨달았다.

그걸 제대로 보지 않고 그저 설치하기 바빠서 이런 오류를 만나게 되었는데,

그래도 모르고 넘어가는 것보단 한 번 이렇게 짚고 넘어가는게 왜 그런지 이유를 알게되기도 하니 속이 시원하다!!!!!!!

덕분에 충돌문제도 해결됐고 빌드도 잘 된다... 이렇게 오류를 만날 때마다 아직은 혼란스럽지만,

조언을 구하고 문제를 해결하면서 하니씩 배우는 이 과정이 기억에도 잘 남고 좋은 것 같다.

한 걸음 더 나아 갔다고 생각하는 중이다.

아직 99476619373 걸음 남았지만,

profile
iOS 좋아. swift 좋아.

8개의 댓글

comment-user-thumbnail
2024년 11월 13일

오... 꾸르팁 감사합니다 (꾸벅)

1개의 답글
comment-user-thumbnail
2024년 11월 13일

오,, 그럼 정적 라이브러리는 컴파일 시 코드에 포함되어 메모리 구조 중 텍스트 세그먼트에 들어가고 동적 라이브러리는 힙이나 스택에 들어가는 건가요?

1개의 답글
comment-user-thumbnail
2024년 11월 14일

SPM을 "Add Package" 을 하는 곳에서 "SnapKit"의 "Add to Target"의 drop down 메뉴를 눌러서 하면 dynamic 제거 같은 것을 안하고, 조금 더 간단하게 할 수 있는걸로 알고 있습니다..!

1개의 답글
comment-user-thumbnail
2024년 11월 14일

과정에 대한 서술이 자세해서 옆에서 과외 받는 기분이 들었어요 ! 글솜씨가 뛰어나신거같아요 !

1개의 답글