Programming Basic
정적 링크 라이브러리(lib) 와 동적 링크 라이브러리(dll) 의 차이점
BAGE
2006. 8. 9. 20:33
정적 링크 라이브러리
C++을 이용하여 코딩을 할때 C++은 기본적인 문법사항만을 규정하며,프로그래밍에 필요한 많은 유용한 기능들은 컴파일러에서 라이브러리 형태로 제공합니다.
예를 들어 C++자체에는 어떤 문자열의 길이를 알아 내는 기능이 없습니다. 그러나,컴파일러에서 strlen()이라는 함수를 라이브러리 형태로 제공하기 때문에 이 기능을 사용할 수 있는 것이지요. 프로그램에서 strlen함수를 사용하면 소스코드가 컴파일된 후 링크될 때, 라이브러리 파일에서 strlen함수의 기능이 구현된 부분이 실행 파일에 덧붙여지게 됩니다. 이렇게 생성된 실행파일은 단독으로 strlen 함수의 기능을 수행할수 있습니다. 당연히 실행파일에 크기가 커집니다.
동적 링크 라이브러리
동적 링크 라이브러리(DLL)는 정적 링크 라이브러리와 달리 어떤 기능이 실행 파일에 직접 덧붙여 지지 않고,DLL 파이에 독립적으로 존재하다가 프로그램이 실행될때 동적으로 링크되어 사용됩니다.
동적 링크 라이브러리를 사용하면 정적 링크 라이브러리를 사용하는 것보다 다음과 같은 장점이 있습니다.
* 메모리와 하드 디스크를 절약할 수 있습니다.
* 프로그램 실행 속도가 빨라집니다.
* 프로그램이 모듈화 됩니다.
우리가 프로그램을 컴파일을 하면 실행 파일이 생성됩니다.
이때 컴파일의 단계를 보면 크게 2 부분으로 나누어져 있습니다.
1. 컴파일
2. 링크
입니다.
1 번에서는 프로그램상의 오류들을 검사하고, 각 명령어를 기계어 코드로
변환하죠. 컴퓨터는 기계어밖에 읽지 못합니다. 그래서 님께서 만드신
프로그램코드를 기계어 코드로 변환하죠.
그리고 2번에서는 님께서 만든 기계어 코드에서 님께서 사용한 함수들의
실행코드(기계어코드)를 찾습니다. 물론 님께서 만든 함수도 있고, 시스템에서
제공한 함수도 있습니다. 시스템에서 제공한 함수는 Librarry 파일이 따로 있기
때문에 해당 Library 에 가서 실행 코드를 가져와서 님께서 호출한 부분에
Copy 합니다. 그리고 님께서 만든 함수가 있다면 그 함수를 찾아서 해당
부분에 Copy 합니다. 이때 실행 코드가 없으면 에러가 나겠죠.
이렇게 크게 두부분으로 처리됩니다. 링크때 함수의 실행코드를 님의 실행코드에
붙이게 되는데 이 방법을 static link Library 라고 합니다. 즉, 링크단계에서
필요한 모든 함수의 코드를 찾아서 붙이는 방법이죠. 이 방법이 좋은것은
어떤 PC 에 실행 코드를 갖다놔도 실행이 됩니다. 즉, Library 파일이
따로 없더라도 실행 파일 자체가 모든 Library 를 가지고 다니기 때문이죠.
하지만 DLL(Dynamic Link Library) 는 링크때 실행 코드를 Library 에서 가져오지
않습니다. 단지 이부분에 오면 어떤 함수를 어디에서 사용한다는 정보만
들어갑니다. 정작 실행할때 해당 파일(DLL 파일) 을 열어서 실행코드를
가져와서 사용합니다.
즉, 컴파일 할때 필요없다는 얘기 입니다.실행 할때 꼭 필요합니다.
그래서 실행 파일과 DLL 파일이 같이 움직여야 합니다. 다른 PC 에 실행파일을
Copy 할때 DLL 파일도 같이 Copy 해야 실행 됩니다.
좀 안좋게 느껴지죠 ?
하지만 좋은 점도 있습니다. 만약 어떤 수정사항이 생기면 static link library 같은
경우는 소스를 수정해서 다시 배포해야 합니다. 하지만
Dynamic Link Library 같은 경우는 수정되는 부분이 DLL 함수내에 있다면
DLL 파일만 수정해서 DLL 파일만 배포하면 됩니다.
그래서 수정사항이 생길수 있는 부분을 DLL 파일로 구현을 해서 혹 수정사항이
생기면 DLL 파일을 다시 배포하는 경우가 많습니다.
자, 이해가 되시나요 ? 그래서 어떤 프로그램을 실행하면 DLL 파일이 없다는
메시지를 본적이 있으시죠 ? 바로 이런 이유 때문입니다.
그리고 Windows Update 가 가끔 일어 나는데 이렇게 DLL 파일만
수정되는 경우도 많습니다. 안그러면 모든 파일을 배포해야 하는데
그 크기가 엄청크겠죠.
C++을 이용하여 코딩을 할때 C++은 기본적인 문법사항만을 규정하며,프로그래밍에 필요한 많은 유용한 기능들은 컴파일러에서 라이브러리 형태로 제공합니다.
예를 들어 C++자체에는 어떤 문자열의 길이를 알아 내는 기능이 없습니다. 그러나,컴파일러에서 strlen()이라는 함수를 라이브러리 형태로 제공하기 때문에 이 기능을 사용할 수 있는 것이지요. 프로그램에서 strlen함수를 사용하면 소스코드가 컴파일된 후 링크될 때, 라이브러리 파일에서 strlen함수의 기능이 구현된 부분이 실행 파일에 덧붙여지게 됩니다. 이렇게 생성된 실행파일은 단독으로 strlen 함수의 기능을 수행할수 있습니다. 당연히 실행파일에 크기가 커집니다.
동적 링크 라이브러리
동적 링크 라이브러리(DLL)는 정적 링크 라이브러리와 달리 어떤 기능이 실행 파일에 직접 덧붙여 지지 않고,DLL 파이에 독립적으로 존재하다가 프로그램이 실행될때 동적으로 링크되어 사용됩니다.
동적 링크 라이브러리를 사용하면 정적 링크 라이브러리를 사용하는 것보다 다음과 같은 장점이 있습니다.
* 메모리와 하드 디스크를 절약할 수 있습니다.
* 프로그램 실행 속도가 빨라집니다.
* 프로그램이 모듈화 됩니다.
우리가 프로그램을 컴파일을 하면 실행 파일이 생성됩니다.
이때 컴파일의 단계를 보면 크게 2 부분으로 나누어져 있습니다.
1. 컴파일
2. 링크
입니다.
1 번에서는 프로그램상의 오류들을 검사하고, 각 명령어를 기계어 코드로
변환하죠. 컴퓨터는 기계어밖에 읽지 못합니다. 그래서 님께서 만드신
프로그램코드를 기계어 코드로 변환하죠.
그리고 2번에서는 님께서 만든 기계어 코드에서 님께서 사용한 함수들의
실행코드(기계어코드)를 찾습니다. 물론 님께서 만든 함수도 있고, 시스템에서
제공한 함수도 있습니다. 시스템에서 제공한 함수는 Librarry 파일이 따로 있기
때문에 해당 Library 에 가서 실행 코드를 가져와서 님께서 호출한 부분에
Copy 합니다. 그리고 님께서 만든 함수가 있다면 그 함수를 찾아서 해당
부분에 Copy 합니다. 이때 실행 코드가 없으면 에러가 나겠죠.
이렇게 크게 두부분으로 처리됩니다. 링크때 함수의 실행코드를 님의 실행코드에
붙이게 되는데 이 방법을 static link Library 라고 합니다. 즉, 링크단계에서
필요한 모든 함수의 코드를 찾아서 붙이는 방법이죠. 이 방법이 좋은것은
어떤 PC 에 실행 코드를 갖다놔도 실행이 됩니다. 즉, Library 파일이
따로 없더라도 실행 파일 자체가 모든 Library 를 가지고 다니기 때문이죠.
하지만 DLL(Dynamic Link Library) 는 링크때 실행 코드를 Library 에서 가져오지
않습니다. 단지 이부분에 오면 어떤 함수를 어디에서 사용한다는 정보만
들어갑니다. 정작 실행할때 해당 파일(DLL 파일) 을 열어서 실행코드를
가져와서 사용합니다.
즉, 컴파일 할때 필요없다는 얘기 입니다.실행 할때 꼭 필요합니다.
그래서 실행 파일과 DLL 파일이 같이 움직여야 합니다. 다른 PC 에 실행파일을
Copy 할때 DLL 파일도 같이 Copy 해야 실행 됩니다.
좀 안좋게 느껴지죠 ?
하지만 좋은 점도 있습니다. 만약 어떤 수정사항이 생기면 static link library 같은
경우는 소스를 수정해서 다시 배포해야 합니다. 하지만
Dynamic Link Library 같은 경우는 수정되는 부분이 DLL 함수내에 있다면
DLL 파일만 수정해서 DLL 파일만 배포하면 됩니다.
그래서 수정사항이 생길수 있는 부분을 DLL 파일로 구현을 해서 혹 수정사항이
생기면 DLL 파일을 다시 배포하는 경우가 많습니다.
자, 이해가 되시나요 ? 그래서 어떤 프로그램을 실행하면 DLL 파일이 없다는
메시지를 본적이 있으시죠 ? 바로 이런 이유 때문입니다.
그리고 Windows Update 가 가끔 일어 나는데 이렇게 DLL 파일만
수정되는 경우도 많습니다. 안그러면 모든 파일을 배포해야 하는데
그 크기가 엄청크겠죠.