문제

나는 프로그램이 제대로 실행하는 데 필요한 중요한 코드를 포함하는 것 외에는 DLL과 LIB에 대해 거의 알지 못합니다 - 라이브러리. 그러나 왜 컴파일러가 그것들을 전혀 생성합니까? 단일 실행 파일에 모든 코드를 포함시키는 것이 더 쉽지 않습니까? 그리고 DLL과 Lib의 차이점은 무엇입니까?

도움이 되었습니까?

해결책

정적 라이브러리 (LIB) 및 동적 라이브러리 (DLL)가 있습니다.

라이브러리는 많은 프로그램에서 사용하려는 코드가있을 수 있으므로 라이브러리가 사용됩니다. 예를 들어 문자열의 문자 수를 계산하는 함수를 작성하는 경우 해당 기능은 많은 프로그램에 유용합니다. 해당 기능이 올바르게 작동하면 코드를 사용할 때마다 코드를 다시 컴파일하지 않아도되므로 해당 기능에 대한 실행 가능한 코드를 라이브러리에 넣으면 링커가 컴파일 된 코드를 프로그램에 추출하고 삽입 할 수 있습니다. . 정적 라이브러리는 때때로 '아카이브'라고 불립니다.

동적 라이브러리는 이것을 한 단계 더 나아갑니다. 각 프로그램에서 공간을 차지하는 도서관 기능의 여러 사본을 갖는 것이 낭비적인 것 같습니다. 왜 그들은 모두 함수의 사본을 공유 할 수 없습니까? 이것이 동적 라이브러리의 것입니다. 컴파일 될 때 라이브러리 코드를 프로그램에 구축하는 대신 메모리에로드 될 때 프로그램에 매핑하여 실행할 수 있습니다. 동일한 기능을 사용하는 동시에 실행되는 여러 프로그램은 모두 하나의 사본을 공유하여 메모리를 저장할 수 있습니다. 실제로 코드를 통한 경로에 따라 필요에 따라 동적 라이브러리를로드 할 수 있습니다. 인쇄를하지 않으면 프린터 루틴이 메모리를 차지할 필요가 없습니다. 반면에, 이것은 프로그램이 실행되는 모든 컴퓨터에 동적 라이브러리 사본을 설치해야한다는 것을 의미합니다. 이것은 고유 한 문제를 만듭니다.

예를 들어, 'C'에 작성된 거의 모든 프로그램에는 'C 런타임 라이브러리라는 라이브러리에서 기능이 필요하지만 모든 기능은 거의 필요하지 않습니다. C 런타임은 정적 및 동적 버전 모두로 제공되므로 특정 요구에 따라 프로그램이 사용하는 버전을 결정할 수 있습니다.

다른 팁

또 다른 측면은 보안 (난독 화)입니다. 주 응용 프로그램에서 코드를 추출하고 "분리 된"동적 링크 라이브러리에 넣으면 코드가 분리되었으므로 코드를 공격하고 분석 (리버스 엔지니어)하기가 더 쉽습니다. 동일한 코드가 LIB 라이브러리에 보관되면 컴파일 된 (링크 된) 대상 응용 프로그램의 일부이므로, 이는 다른 대상 바이너리와 해당 코드를 분리 (차별화)하기가 더 어렵습니다.

실행 파일로 코드를 컴파일하는 대신 DLL/LIB를 생성하는 중요한 이유 중 하나는 재사용 및 재배치입니다. 평균 Java 또는 .NET 애플리케이션 (예를 들어)은 여러 타사 (또는 프레임 워크) 라이브러리를 사용할 가능성이 높습니다. 모든 타사 코드를 애플리케이션에 컴파일하지 않고 사전 구축 된 라이브러리에 대해 컴파일하는 것이 훨씬 쉽고 빠릅니다. 코드를 라이브러리로 컴파일하면 좋은 디자인 관행이 장려됩니다.

DLL은 다른 실행 가능한 프로그램과 공유되는 기능 라이브러리입니다. Windows/System32 디렉토리를 살펴보면 수십 개의 디렉토리를 찾을 수 있습니다. 프로그램이 DLL을 작성하면 일반적으로 Application *.Exe 프로그램이 DLL에서 선언 된 기호를 해결할 수 있도록 LIB 파일을 작성합니다.

a .lib는 프로그램과 정적으로 연결된 함수 라이브러리입니다. 다른 프로그램은 공유하지 않습니다. *.lib 파일과 링크하는 각 프로그램에는 해당 파일의 모든 코드가 있습니다. C.lib와 연결되는 두 가지 프로그램 A.Exe 및 B.exe가있는 경우 각 A와 B는 모두 C.lib의 코드를 포함합니다.

DLL 및 LIB를 만드는 방법은 사용하는 컴파일러에 따라 다릅니다. 각 컴파일러는 다르게 수행합니다.

또 다른 차이점은 성능에 있습니다.

DLL이 .exe (s)에 의해 런타임에로드됨에 따라 .exe (s) 및 dll은 공유 메모리 개념과 작동하므로 성능은 정적 링크에 상대적으로 낮습니다.

반면에 .lib는 컴파일 시간에 정적으로 요청하는 모든 프로세스에 연결된 코드입니다. 따라서 .exe (들)는 단일 메모리를 가지므로 프로세스의 성능이 증가합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top