본문 바로가기
Swift/오류 개발자

Swift | SnapKit no such file or directory 오류

by UDDT 2025. 3. 18.

신문물을 접하다

 

  평화로운 오전,

코드베이스 UI 강의를 듣다가 튜터님께서 SnapKit이 현업에서 많이 사용하는 라이브러리라고 설명해주셨다

 

  그래서 SnapKit을 사용하면 뭐가 좋은데?

(좌) 사용 전, (우) 사용 후

 

 

  

초보자의 눈이 번쩍 떠지는 심봉사급 체험이었다

 

SnapKit 설치하기

 SnapKit 설치하기

    1. Project > General > Framework, Libraries > (+) 버튼 누르기

 

    2. Add Package Dependency... 클릭

 

    3. SnapKit 깃허브 주소 Ctrl+C, Ctrl+V > Add Package

 

    4. import SnapKit으로 사용하기

    

    호기롭게 코드를 작성하고 빌드를 했다.

  근데 오류가 났다(이거 억까야)

초보자는 설치도 어렵다

No such file or directory

  

  설치가 어렵지도 않았고, 강의를 잘 따라 갔는데 왜 나한테만 이런 시련을 주는걸까?

 

오류 해결하기

SnapKit-Dynamic 삭제하기

 

  삭제하고 실행하면 정상 빌드가 된다

 

오류 분석하기

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

    1. 정적 라이브러리

        - 확장자 : .a(Linux, macOS), .lib (Windows)

        - 컴파일 시 라이브러리 코드가 실행 파일에 미리 포함됨

        - 배포 시 실행 파일 하나만 있으면 되고, 추가적인 라이브러리 파일이 필요 없음

        - 실행 속도가 빠름(라이브러리를 미리 포함하고 있어 로딩 시간이 없는 것)

        - 하지만 실행 파일 크기는 커질 수 있음

        * 독립적인 실행 파일이 필요할 때, 속도가 중요할 때 사용

 

    2. 동적 라이브러리

       - 확장자 : .so(Linux, macOS), dylib(macOS), dll(Windows)

       - 실행 파일에는 라이브러리의 참조 정보만 포함

       - 실행 시 라이브러리가 동적으로 로드됨

       - 실행 파일 크기가 작아지며, 여러 프로그램이 동일한 라이브러리를 공유할 수 있음

       - 하지만 실행할 때 라이브러리가 없으면 실행할 수 없음

        * 여러 프로그램이 같은 라이브러리를 공유할 때, 유지보수가 용이해야 할 때 사용

 

 정적 라이브러리, 동적 라이브러리를 같이 쓸 수는 없을까?

챗GPT랑 친구 먹은 나..

 

  만약 게임 개발을 한다고 할 때,

       - 게임 엔진의 핵심 그래픽 연산 > 정적 라이브러리(.a)

       - 플러그인 시스템 > 동적 라이브러리 (.so, dylib) 

  위의 방식으로 혼합하여 효율적으로 사용할 수 있다

 

  다만 혼용해서 사용할 때 주의해야 하는 점이 있는데,

  1. 심볼이 충돌하면 안된다.

      - 같은 함수 / 클래스가 정적, 동적 라이브러리에 중복될 경우 링커 오류가 발생한다

      - 네임스페이스 관리(예: C++ namespace, Swift module)가 중요하다

  2. 동적 라이브러리 로드 문제

      - 실행할 때 .so 또는 .dylib가 없으면 실행되지 않는다

      - macOS에서는 @rpath 설정을, Linux에서는 LD_LIBRARY_PATH 환경 변수를 설정해야 한다

  3. 크로스플랫폼 고려

      - Windows에서는 .dll을, mac OS에서는 .dylib를, Linuxs는 .so를 사용하므로 빌드할 때 주의해야 한다

 

그래서 SnapKit에서는 왜 안된건데?

  1. 심볼이 충돌하면 안된다. 에 해당되는 오류다

      SnapKit과 SnapKit-Dynamic은 내부적으로 동일한 이름과 심볼을 공유하므로, 빌드 과정에서 심볼이 충돌하여 오류가 발생한다

      따라서 둘 중 하나를 지워주면 문제는 자연스럽게 해결된다

 

최근댓글

최근글

skin by © 2024 ttuttak