라이브러리
여러 프로그램에서 자주 사용하는 함수와 데이터들을 실행이 가능한 바이너리 형태로 묶어놓은 파일을 의미한다.
다음 코드를 보자
#include <stdio.h>
int main()
{
printf("Hello");
return 0;
}
실행 가능한 printf 함수의 바이너리는 어디에 있을까?
stdio.h에 있을까? 그 안에 존재하는 것은 printf함수의 정의가 아니라 선언이다.
그럼 어디에있음? "라이브러리"에 있다.
라이브러리는 정적 라이브러리랑 동적 연결 (Dynamic link)라이브러리로 나눌 수 있다.
.
정적 라이브러리(static library)
static library를 만드는 상상을 해보자. 헤더에 함수를 선언하고, 적절히 정의도 해놨다.
foo.h / foo.cpp 이렇게하고 컴파일 돌리면 foo.lib이 생겼다.
그래서 다른 프로젝트에서 #include "foo.h"를 하고 foo()를 호출한다. 잘 동작할까?
아니다. 링커가 foo()함수를 못찾았다고 오류를 발생시킬 것이다. 따라서 프로젝트한테 foo()함수는 foo.lib에 있다고 알려줘야 한다. 이를 위해 프로젝트 빌드 시 foo.lib을 포함한다고 설정해줘야 한다. 프로젝트 속성에서 지정을 해 주거나 별도 코드로 지정이 가능하다.
여기서 중요한건 라이브러리가 실행파일 안에 포함된다는 것이다. 이제 둘은 분리못함
.
동적 라이브러리(DLL)
동적은 말 그대로 실행파일 안에 라이브러리를 포함시키지 않고, 동적으로 포함시킨다는 것이다.
이건 그럼 왜 쓸까? 우선 중복을 제거할 수 있다는 이점이 있다.
예를들어서 A,B,C 실행파일(.exe)가 있고 이게 전부 foo.lib을 쓴다고 해보자. 그러면 이 세 가지 실행파일에 모두 foo.lib이 중복 포함되어있다. 이 세가지 프로그램을 실행한다 치면? 메모리의 Code영역에 foo.lib의 내용들 중복해서 올라갈 것이다.
따라서 foo.lib을 외부 링크로 빼서 하나만 메모리 영역에 올려두고 있으면 더 효율적으로 메모리를 관리할 수 있다.
추가적으로 메모리 관리 측면에서도 이점이 있다.
A.exe의 가상 메모리가 있다고 치자. 그러면 여기에는 정적 라이브러리도 포함된다. 이는 정적 라이브러리를 포함하여 가상 메모리를 구성한다는 뜻이다. 즉, A 프로세스를 실행중일 때 메인메모리에 정적 라이브러리 영역이 포함될 수 있다는 뜻이다.
아무튼 CPU가 A,B 두 개의 프로세스를 실행한다. 프로세스 전환 시에 메인 메모리에 올라가 있는 A.exe와 B.exe의 가상 메모리 영역이 스왑되겠지?
근데 정적 라이브러리에서 동일한 메모리 영역을 A,B가 공유한다면? A,B 전환될 때 공유함에도 불구하고 메모리 다 반환한다음, 각자의 라이브러리 영역을 새로 올려야 함.
만약 DLL이라면? 어쩌피 사용하는 영역은 같을 태니까 그냥 놔두면 된다. 이 때 공유는 페이지 단위로 된다.
DLL만들때는 lib, dll 둘 다 생기는데 여기서의 lib파일은 링크할때 필요한 정보들을 들고 있는거임.
.
dll과 extern 선언
네임 맹글링이라는 걸 알아야 하는데 컴파일러가 이름을 정해진 규칙에 의해 바꾸는 것. 근데 이게 컴파일러마다 다름. 예를 들면 c에서는 네임 맹글링을 수행하지 않는데 cpp에서는 수행한다.
이걸 왜 언급했냐? dll이 하나가 있는데 이게 서로 다른 네임 맹글링 방식을 쓴 컴파일러가 생성한 코드들에서 같이 쓰고 있다고 해보자. 이 서로 다른 컴파일러는 서로 다른 이름으로 dll에 있는 함수의 이름을 바꿀 것인데. 그럼 당연히 해당 함수를 못 찾게 된다.
따라서 "이 함수는 네임 맹글링 하지마~" 라고 지정해줄 필요가 있다. 그래서 extern "C" 이렇게 선언을 앞에 해주면 이름이 변경되지 않음. (IL2CPP에서 C# IL코드를 CPP로 바꿀때도 지정해줌)
아무튼 이렇게 가져다 쓰면 암묵적 연결이고.. 명시적으로 연결할 수도 있음. 코드 내에서 dll을 연결하는 함수를 호출하면 됨.
'이론 > 기초' 카테고리의 다른 글
네트워크 - 레이턴시 및 신뢰성 (0) | 2023.09.01 |
---|---|
게임 네트워크 토폴로지 (0) | 2023.08.27 |
OS - 메모리 관리 기초 (0) | 2023.08.13 |
OS - 쓰레드 (0) | 2023.08.06 |
OS - 프로세스 (0) | 2023.07.30 |