C++를 다시 보며 공부하던 와중, CMakeLists.txt 내부에서 궁금증이 드는 부분이 생겼다.
add_library(LIB_NAME [STATIC|SHARED|MODULE] ... )
add_library 사용 시에 들어가는 저 STATIC, SHARED 태그가 뭔지 궁금해졌다. static library, dynamic library 많이 들어봤지만 정작 어떤 차이인지 모르는 것을 보고 한 번 찾아봤는데 이 글에서 얕게 나마 정리해보고자 한다.
Library란?
library란 익히 들어알고 있겠지만 프로젝트를 구현할 때 공통적으로 쓰는 기능들을 매번 재구현하기 어려우니 미리 구현해서 불러오기 가능한 형태로 저장한 코드 집합을 말한다. python에서는 볼 일이 없지만 c++에서는 .lib, .dll과 같은 확장자를 갖고 있는 파일에 해당한다. .lib가 static, .dll이 dynamic 을 의미한다.
dynamic은 shared라고 불리기도 한다.
Static vs Dynamic library
코드를 build할 때, 소스코드로 부터 object file .o 파일을 생성하고 이 o file들을 서로 linking하는 과정이 진행된다. static과 dynamic의 차이는 여기서 발생한다.
둘 다 프로젝트의 executable 파일이 기능들을 불러올 수 있도록 link되는 것은 동일하지만 executable 파일 안에 존재하는지 밖에 존재하는지 차이다.
즉, static library는 executable 파일 안에 .o 파일들이 binary code로 같이 compile되는 경우고, dynamic library는 link만 유지한 채 .o 파일들이 executable 파일 밖에 존재한다.
staic library의 경우, executable 안에 박혀들어가 있으므로 실행할 때 처음부터 포함되어 있는 상태고, dynamic library는 실행시킬 때 link를 타고 가서 순차적으로 연결된다. 결과는 같다.
장단점
static library의 경우, compile 시에 executable 파일 자체에 박혀있으므로 runtime과 무관하다. .o 파일들이 compile 이후엔 필요가 따로 없다.
반면 dynamic library는 외부에 있으므로 연결되기 전까진 library 파일들이 있어야 한다. 또한 연결 상태를 유지해야하기 때문에 살짝 느리다.
이렇게 보면 static이 항상 좋을 것만 같은데 dynamic의 장점은 여러 프로젝트에서 한 library를 공유하고자 할 때다.
하지만 여러 프로젝트에서 같은 library를 사용할 경우, static libary는 같은 코드임에도 N번 반복해서 compile되므로 불필요한 메모리 소모를 야기하는 반면 외부에 존재하는 dynamic library는 1개만 두고 linking만 여러 번 하면 된다.
업데이트도 쉽다는 장점이 있다. library가 변경되었을 때 dynamic library는 원본 파일 하나만 변경하면 되는데 static의 경우, 박혀들어가있기 때문에 모든 프로젝트를 다시 compile해야 되는 수고로움이 있다.
*주의점은 dynamic library가 update되었을 때, executable을 그대로 실행한다면 메모리에 적혀있는 예전 library를 사용할 위험이 있다. 안전을 위해선 build 다시 하는 것이 좋긴 하다.
'Knowledge > Vision' 카테고리의 다른 글
3D transformation(R, t) matrix usage (0) | 2023.12.06 |
---|---|
Spherical harmonic 직관적으로 이해하기 (0) | 2023.11.23 |
Positional embedding (직관적 이해) (0) | 2023.09.13 |
Image flickering (0) | 2023.08.17 |
Trifocal tensor 이해하기 (0) | 2023.03.30 |