라이브러리
라이브러리란?
* 라이브러리는 다른 파일들과 합쳐지기 위한 파일이다. (허접한 설명이네)
* 다른 파일과 합쳐지는 게 목적이므로 프로젝트이지만 실행파일을 만들지 않는다.
* 코드 재사용이 매우 높다.
* C에서 라이브러리는 정적 라이브러리와 동적 라이브러리로 나눌 수 있다.
* 대표적으로 c표준라이브러리에 들어있는 함수들을 우리는 자유롭게 사용한다.
코드가 내부적으로 어떻게 도는지 정확히 알 수는 없지만
우리는 라이브러리를 믿고 함수를 사용한다.
* 소스코드를 보여줄 수도 있지만, 라이브러리는 오브젝트파일만 보내도 괜찮다.
헤더파일과 함수에 대한 설명만 충분하다면 우리는 기술 유출을 방지하며
라이브러리를 배포할 수 있다.
라이브러리는 프로젝트이다
* 일단 프로젝트(project)란 실행파일이나 라이브러리를 만드는 파일 묶음이다.
또한 여러 프로젝트가 모여있는 단위는 솔루션(solution)이라고 한다.
* 라이브러리는 파일이니, 프로젝트라고 할 수 있고,
같은 솔루션에 있는 다른 프로젝트와 합쳐져 하나의 실행파일을 만들 수 있다.
라이브러리는 오브젝트 파일이다.
* 굳이 오브젝트 파일이 아니어도 된다. (코드 자체를 보낼 수도 있으니까)
* 하지만 보통 오브젝트 파일로 보내는데,
기술 유출이나 코드를 임의적으로 변경하는 것을 막기위해서이다.
* 오브젝트 파일이라는 것은 이미 컴파일이 되었다는 뜻이므로 링킹과정만 거치면 된다.
정적 라이브러리
* 정적 링킹을 하기 때문에 정적 라이브러리이다.
* 정적 라이브러리는 복사되어 실행파일에 넣어진다.
* 확장자는 *.lib이다. (visual studio)
* 실행 파일에 포함되어 같이 최적화가 일어난다. 성능상 이득
* 라이브러리까지 포함되어 실행파일이 커진다.
* 같은 라이브러리를 사용하는 프로그램을 동시에 돌린다면
똑같은 라이브러리가 메모리에 여러개 있으므로 성능상 손해.
동적 라이브러리
* 동적 링킹을 하기 때문에 동적 라이브러리이다.
* 라이브러리를 실행 파일에 포함하지 않는다.
* 링킹 과정이 끝난 실행파일에 아직 빈 공간이 있으며,
실행 중에 운영체제가 빈공간과 라이브러리를 링킹한다.
* 확장자는 *.dll이다. (window)
* 실행파일과 라이브러리가 따로 최적화된다.
* 실행파일이 비교적 작으며, 같은 라이브러리를 사용하는 프로그램이 많아도
라이브러리는 하나만 존재할 수 있다.
* 같은 라이브러리를 사용하는 프로그램을 여러개 실행 시켜도
메모리에 라이브러리는 하나만 잡힌다. 성능상 이득
* 같은 라이브러리를 사용하는 줄 알았는데, 라이브러리에 버젼이 다르다면?
2개의 다른 프로그램이 같은 라이브러리를 사용하는데, 버젼이 다를때
이를 예상하고 프로그램을 작성하지 않았다면 답이 없다. (DLL HELL)
라이브러리 사용법
* 기본적으로 정적 라이브러리를 사용하자.
* 동적 라이브러리를 사용할 경우, 선택적 로딩이 가능하도록 하자.
* 동적 라이브러리의 경우, 함수 메모리 주소를 통해 동적 링킹을 하므로,
해킹에 취약하다.
귀여운 그림은 낡은 창고님이 그리셨습니다.
'C' 카테고리의 다른 글
restrict 키워드 (0) | 2021.02.06 |
---|---|
전역변수 (3) | 2021.02.06 |
전처리기와 매크로 <3> (0) | 2021.02.04 |
전처리기와 매크로 <2> (0) | 2021.02.03 |
전처리기와 매크로 <1> (0) | 2021.02.03 |