문서의 을 확인하세요.
DJMAX RESPECT V의 비공식 대회에 대한 내용은 DJMAX : Luxpect League 2023 문서 참고하십시오.
1. 개요
DLL은 여러 프로그램에서 동시에 사용할 수 있는 코드와 데이터를 포함하는 동적 라이브러리이다.라이브러리란 소프트웨어 개발에서 자주 쓰고 기초적인 함수들을 중복 개발하는 것을 피하기 위해서 표준화된 함수 및 데이터 타입을 만들어서 모아 놓은 것이다. 이런 라이브러리는 언제 메인 프로그램에 연결하느냐에 따라서 Static Link와 Dynamic Link로 나뉘며, DLL은 이 중 후자, 특히 윈도우 계통에서 사용되는것을 뜻한다. 보통 배포시에는 런 타임 라이브러리라는 이름으로 배포된다.
스태틱 링크는 컴파일 시점에 라이브러리가 링커에 의해 연결되어 실행 파일의 일부분이 된다. 그러나 다이나믹 링크는 각 실행 파일에서 해당 라이브러리의 기능을 사용 시에만, 라이브러리 파일을 참조하여(혹은 다운로드받아) 기능을 호출한다.
2. 장점
- 프로그램의 모듈화가 가능해진다.
- 컴파일 시간이 줄어든다.
- 외주 개발시 기능을 제공할 때 소스 코드 없이 기능만을 제공할 수 있다.
- 모듈별로 버전관리가 가능해진다.
- 기능 모듈을 따로 사용할 때, 한쪽의 내부 코드가 변경되더라도 인터페이스가 같다면 다른 쪽의 코드 변경 없이 그대로 사용가능하다. 아예 새로 컴파일도 필요없이 파일교체만으로도 업그레이드가 가능해진다.
- 별도 모듈로 취급되고 사용 프로그램과 소스코드단위에서 분리되어있기 때문에 동일한 이름의 객체/클래스 또한 충돌 없이 사용 가능하다.
- 특히 라이브러리와 프로그램에서 같은 라이브러리, 다른 버전을 참조 사용하는데 정적 링크나 내부 소스로 링크한다면 네임스페이스나 클래스명이 겹치면서 동명함수/목적파일명이 겹치거나 겹쳐 실행/컴파일시에 오류를 낸다. 물론 겹치는 한쪽의 클래스/네임스페이스명을 변경해서 이럴 때 DLL로 외부로 빼주면 충돌없이 사용 가능하다.
- 같은 운영체제/아키텍처라면 라이브러리를 로드하는 프로그램과 다른 언어로 제작되었어도 해당 기능을 사용가능하다. 예를 들어 생산성이 중요한 UI는 좋은 UI 툴이 지원되는 C#으로 빠르게 제작해서 실행 파일을 만들고, 실행 속도가 중요한 내부 기능은 C++로 작성한 DLL로 컴파일해서 둘을 링크시키면 생산성과 속도 사이에서 줄 타기가 용이하다.
- 결과 프로그램 파일의 용량과 프로그램 코드의 메모리 상주량이 줄어든다.
- 같은 기능을 사용하는 프로그램 두개가 운영체제상에 동시에 존재한다면 각각의 프로그램에서 메모리를 사용하지만, 겹치는 기능을DLL로 빼서 사용한다면 프로그램 코드가 메모리에 하나만 올라가도 각각 프로그램에서 참조할 수 있어 그만큼의 용량이 절약된다.
- 마찬가지로 컴파일 완료된 프로그램 코드 크기 또한 작다.
- 어차피 DLL 내용은 바뀔 일이 적기 때문에, 프로그램 수정, 업데이트 시 컴파일 된 실행파일만 업데이트하여 서버 트래픽, 용량 등의 네트워크 자원 또한 절약된다.
- DirectX 등 고용량 라이브러리의 경우 필요한 기능만 DLL을 로딩하여 메모리를 절약하기도 한다.
- 다만 최근에는 코드가 아닌 데이터의 메모리 사용량이 수GB에 이르는데 반해 코드 자체의 용량은 정말 큰 프로그램이라봐야 100MB를 넘지 못하는게 대다수이다. OpenCV 또한 이전까지는 각 기능별로 DLL을 만드는 것[1]이 기본 옵션이였지만, 최근 버전들은 그냥 DLL 하나에[2] 때려박아 릴리즈하는 옵션이 기본으로 설정되어있다.
- LGPL 라이선스로 공개된 오픈 속스 프로젝트의 경우 정적 라이브러리 또는 내부 코드로 프로젝트에 포함시키면 프로그램의 전체 소스 코드를 공개하여야 하지만, 동적 라이브러리로 링크시킬 경우 해당 의무가 없기 때문에 DLL로 링크하는 경우도 많다.
3. 단점
- 버전 관리를 잘못하면 프로그램 수정시 엇나가는 경우가 생긴다.
- 혼자서 관리하는 경우 모듈별 디버깅이 귀찮아진다.
- 프로그램 배포시 런 타임 DLL 파일 또한 함께 배포해주어야 한다. 비주얼 스튜디오로만 제작한 프로그램의 경우 마이크로소프트의 런 타임 라이브러리 링크를 배포할 수 있으나, 기타 라이브러리를 사용한 경우 직접 첨부하여 배포하거나 아니면 아예 정적 라이브러리를 사용해서[3] 실행 파일에 한번에 첨부시켜야 한다.
4. dll 오류
관련문서: 컴퓨터 고장 정보dll 오류에 관해서 검색하면 해당 dll 파일을 따로 다운받으라는 글을 많이 볼 수 있는데 주로 dll 파일을 제공하는 사이트로 가라고 한다. 하지만 그런 사이트에 있는 파일들의 경우 최신 버전이 아닌 구 버전으로 해결이 안될 수 있기 때문에 dll 파일을 따로 구하기보다는 해당 dll 파일이 포함된 드라이버를 재설치하는게 낫다.
- ntdll.dll 의 appcrash
- 여기처럼 최근에 수정된 프로그램을 삭제해보거나 레지스트리의 HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Browser Helper Objects 하단의 경로들을 삭제해준다.
- 윈도 7 환경에서 IE 11과 플래시가 동시에 설치되어 있을 경우 인터넷 실행시 플래시가 포함된 페이지에서 오류를 일으킨다. 이 경우 IE 11을 롤백하면 된다.
- msvcp숫자.dll 혹은 vcr숫자.dll 혹은 msvcr숫자.dll가 없다고 할 때
- 120: Visual Studio 2013 다운로드
- 140: Visual Studio 2015 다운로드
- 이후 버전은 런타임이 하나로 통합되어 있다.
- X3DAudio1_7.dll이 없음
다이렉트X를 설치하면 된다. - d3dx9_\#(숫자).dll이 없음
인터넷에서 d3dx9_(아무 숫자).dll 검색해서 다운받고 이름을 해당 숫자로 바꿔 프로그램을 실행시킬 폴더나%SystemRoot%\System32\
에 넣으면 된다. 이것도 마트료시카 마냥 여러 개가 뜨기 시작하면 그냥 최종 사용자 런타임을 설치하자.
이 파일은 다양한 곳에서 오류를 일으키며 상당히 골때린다. 인터넷 익스플로러 오류의 해결방법으로는 다음이 있다.
Visual Studio로 개발된 애플리케이션의 경우 개발한 Visual Studio의 버전에 따른 dll 종속성이 생기는데 그 dll이 없을 경우 실행되지 않는다. 따라서 버전에 맞는 재배포 가능 패키지(런타임)을 설치하면 된다.
5. 여담
개발자들은 좋아하지만, 사용자들은 싫어한다. 아무래도 로딩 시간에 영향을 미친다는 인식이 있기 때문에 그런 듯. 다만 대다수 DLL 파일들의 용량을 생각해보면 이것들이 로딩 시간에서 얼마나 차지할지는.. 일부 프로그램은 dll이 없어서 에러를 내뱉기도 한다 NT 6.x 이상의 환경에서 Direct X 9 라이브러리 문제로 에러를 띄운다.[4] 실제로 로딩 시간에 소요되는 시간 대부분은 압축/패킹된 리소스 파일을 메모리에 올리는 과정이 대부분을 차지한다. 오히려 DLL의 경우 이미 같은 라이브러리를 쓰는 프로그램이 있으면 이미 메모리에 올라가 있는 라이브러리 크기만큼 로딩 시간이 짧아진다.그러나 2023년 기준 이런 경우를 찾기가 어려운데, 게임/프로그램 개발사들이 아예 프로그램 설치시 설치 경로에 DLL 파일을 다 때려박거나 라이브러리가 설치되어 있는지 검사해서 자동으로 같이 설치되도록 만들기 때문이다.
5.1. 기타
- 관련용어
- DLL Hell
[1] opencv_core000.dll, opencv_highgui000.dll, 기타등등...[2] opencv_world000.dll 등.[3] 오픈 소스의 경우 정적 라이브러리 컴파일을 지원하는 경우도 있다. 단 라이선스 문제가 생길 수도 있다(가령 LGPL의 경우는 동적 라이브러리로 쓰면 문제가 없지만, 정적 라이브러리로 쓰면 알짤없이 소스 코드를 풀어야 한다.).[4] 해결 방법은 DirectX9 최종 사용자 런타임을 설치해야 하고 DX9 미지원 GPU는 dgvoodoo같은 Glide-DirectX 래퍼도 설치해야 한다.