미구분

dll, Dynamic Link Library 와 lib, Static Link Library 의 차이

게임이 더 좋아 2021. 12. 19. 16:07
반응형
728x170

Dynamic과 Static의 차이를 안다면..

일반적으로 정적인 것은 프로그램의 수명주기 내내 있을 것이고

동적인 것은 프로그램 실행 중에서 할당 해제가 되는 것을 의미한다는 것을 추측할 수 있다.

맞나 확인해보자

 


 

1. 동적 라이브러리(Dynamic Link Library)

  • 프로그램 실행 시 필요시에만 외부 DLL 파일에서 함수를 참조

다시 말해서, 정적 링크와는 다르게 컴파일 시점에 실행 파일에 함수를 복사하지 않고 함수의 위치 정보를 이용해서 그 함수를 호출할 수 있게 한다.

예를 들면 정적 라이브러리와는 달리 클래스라고 치면 객체를 하나만 만들고, 해당 객체의 포인터를 이용한다고 생각하면 된다.

 즉, 코드만 가져다쓰고, exe에 포함되지 않는다.

dll로 뽑아내고 싶은 함수를 골라서 뽑을 수 있다.

  • 프로그램 실행 시 프로그램 로딩 시간이 단축

 

  • 한 코드를 여러 프로그램이 동시에 사용하기 때문에 메모리가 절약된다.

 

  • 함수 업그레이드 시 해당 DLL만 수정 배포한다.

DLL 내의 함수를 업데이트하거나 수정해야 하는 경우 DLL을 배포하고 설치할 때

프로그램을 DLL과 다시 연결하지 않아도 된다.     

그리고여러 프로그램이 같은 DLL을 사용하는 경우에는 모든 프로그램에 업데이트나 수정 내용이 적용된다.

 

  • 정적링크를 사용하는 경우 실행 파일에 라이브러리의 함수가 모두 포함되어 실행파일이 커지지만 DLL을 사용하는 프로그램은 크기가 작다.

 

  • 실행 파일 만들때 필요한 파일: *.h,*.lib (*.dll 참조 용)

dll을 만들 때, lib도 같이 생성되는데 이때 만들어진 lib는 정적 라이브러리의 역할을 하는 것이 아니라

lib은 dll이 제공하고자 하는 함수 정보를 가지고 있다.

컴파일은 호출하고자 하는 함수의 선언부만 있으면 되지만, 실행파일의 생성은 선언에 대한 정의가 완전히 존재해야 만들어진다. (실제로 선언부만 존재한 형태로 컴파일을 하면 링크에러가 발생한다.)

이러한 에러를 해결하기 위해 dll이 만들어질 때, lib도 같이 만들어진다.

 

dll을 생성할 때 함께 만들어지는 lib 파일에는 링커가 실행파일을 만드는데 필요한 정보가 담겨 있다.

-> lib 파일은 링크할 때 필요하고, dll 파일은 실행할 때 필요하다.

 

  • 프로그램 실행할 할 때 필요한 파일: *.dll (배포할 때 *.dll 필요)

 

  • 프로그램이 DLL을 사용할 때는 종속성이라는 문제로 인해 프로그램이 실행되지 않을 수 있다.


**DLL 종속성 이란?

 

프로그램이나 DLL이 다른 DLL의 DLL 함수를 사용하는 경우 종속성이 발생한다.

이런 경우 해당 프로그램은 더 이상 자체 포함 프로그램이 아니며, 종속성이 손상되면 프로그램에 문제가 발생할 수 있다.

예를 들어 다음 작업 중 하나를 수행하면 프로그램이 실행되지 않을 수 있다. 

 

1) 종속 DLL을 새 버전으로 업그레이드하는 경우

2) 종속 DLL을 수정하는 경우

3) 종속 DLL을 이전 버전으로 덮어쓰는 경우

4) 종속 DLL을 컴퓨터에서 제거하는 경우

 

이러한 작업을 대개 DLL 충돌이라고 하고

이전 버전과의 호환성이 적용되지 않으면 프로그램이 정상적으로 실행되지 않을 수 있다.




2. 정적 라이브러리(Static Link Library)

 

  • 필요한 함수를 프로그램 코드에 붙여 프로그램 자체에서 참조

 

  • 프로그램 실행 후 빠른 처리시간

 

  • 실행파일 안에 라이브러리가 하나로 묶인다.

 

  • 컴파일 시간에 라이브러리가 링커에 의해 연결된다.

 

  • 프로그램 실행 파일만 있으면 실행(실행 파일 안에 라이브러리가 묶여있기 때문)

 

  • 실행 파일 만들때 필요한 파일: *.h,*.lib (별도의 *.dll 필요 없음)




 

반응형
그리드형

'미구분' 카테고리의 다른 글

전세계약 전,후  (0) 2023.02.17
멀티윈도우, Multi-window  (0) 2022.12.01
2022 하반기 채용 결과  (7) 2022.11.01
UTF-8, UTF-16 그리고 ASCII  (0) 2022.06.11
게임 개발자로서 발전하는 방법  (2) 2021.05.29