--dll과lib의 차이
6210 단어 dll
하나는 LIB가 함수가 있는 DLL 파일과 파일의 함수 위치에 대한 정보(입구)를 포함하고 있으며, 코드는 실행할 때 프로세스 공간에 불러오는 DLL에서 제공되며, 동적 링크 라이브러리dynamic link library라고 부른다.
하나는 LIB가 함수 코드 자체를 포함하고 컴파일할 때 코드를 프로그램에 직접 추가하는 것을 정적 링크 라이브러리static link library라고 한다.
다음과 같은 두 가지 링크가 있습니다.
동적 링크는 동적 링크 라이브러리를 사용하여 실행 가능한 모듈(.dll 파일 또는.exe 파일)을 실행할 때 DLL 함수를 찾는 실행 가능한 코드에 필요한 정보만 포함할 수 있습니다.
정적 링크는 정적 링크 라이브러리를 사용합니다. 링크는 정적 링크 라이브러리 LIB에서 인용된 모든 함수를 가져와 라이브러리와 코드를 실행 가능한 파일에 넣습니다.
lib과 dll의 차이점은 다음과 같습니다.
(1)lib은 컴파일할 때 사용되고 dll는 실행할 때 사용됩니다.원본 코드의 컴파일을 완성하려면lib만 필요합니다.동적 링크 프로그램을 실행하려면 dll만 필요합니다.
(2) 만약에 dll 파일이 있다면lib는 일반적으로 색인 정보로 dll에서 함수의 입구와 위치를 기록하고 dll에서 함수의 구체적인 내용을 기록한다.만약lib 파일만 있다면, 이lib 파일은 정적 컴파일로 인덱스와 실현이 모두 포함되어 있습니다.정적 컴파일된lib 파일을 사용하면 프로그램을 실행할 때 동적 라이브러리를 다시 걸 필요가 없습니다. 응용 프로그램이 비교적 크고 동적 라이브러리의 유연성을 잃기 때문에 새로운 버전을 발표할 때 새로운 응용 프로그램을 발표해야 합니다.
(3) 동적 링크의 경우 두 개의 파일이 있습니다. 하나는 LIB 파일이고 하나는 DLL 파일입니다.LIB는 DLL에서 내보낸 함수 이름과 위치를 포함하고 DLL은 실제 함수와 데이터를 포함하며 응용 프로그램은 LIB 파일을 사용하여 DLL 파일에 연결합니다.응용 프로그램의 실행 파일에는 호출된 함수 코드가 아닌 DLL에 있는 해당 함수 코드의 주소가 저장되어 메모리 자원을 절약할 수 있습니다.DLL 및 LIB 파일은 애플리케이션과 함께 릴리즈되어야 합니다. 그렇지 않으면 애플리케이션에 오류가 발생합니다.lib 파일을 사용하지 않거나 lib 파일이 없는 경우 WIN32 API 함수인 LoadLibrary, GetProcAddress를 사용하여 로드할 수 있습니다.
lib을 사용하려면 다음 두 파일에 유의해야 합니다.
(1).h헤드 파일,lib에서 출력을 설명하는 클래스나 기호의 원형이나 데이터 구조를 포함합니다.프로그램에서lib을 호출할 때 이 파일을 프로그램의 원본 파일에 포함해야 합니다.
(2).LIB 파일, 생략.
dll을 사용하려면 다음 세 가지 파일에 유의해야 합니다.
(1).h헤드 파일은 dll에서 출력된 클래스나 기호의 원형이나 데이터 구조를 설명합니다.h 파일.프로그램이 dll를 호출할 때, 이 파일을 프로그램의 원본 파일에 포함해야 합니다.
(2).LIB 파일은 dll가 컴파일하고 링크에 성공한 후에 생성된 파일로 다른 프로그램이 dll을 호출할 때 이 파일을 프로그램에 도입해야 하며, 그렇지 않으면 오류가 발생합니다.
lib 파일을 사용하지 않거나 lib 파일이 없는 경우 WIN32 API 함수인 LoadLibrary, GetProcAddress를 사용하여 로드할 수 있습니다.
(3).dll 파일, 진정한 실행 가능한 파일, 개발에 성공한 응용 프로그램이 발표될 때, 단지 있습니다.exe 파일 및.dll 파일, 필요 없습니다.lib 파일 및.h 헤더 파일.
lib를 사용하는 방법: 정적 lib에서 하나의lib 파일은 사실상 임의의obj 파일의 집합이고 obj 파일은 cpp 파일을 컴파일하여 생성합니다.이런 정적 라이브러리 프로젝트를 컴파일할 때 링크 오류가 발생하지 않는다.오류가 있어도 이lib을 사용하는 EXT 파일이나 DLL 프로젝트에서만 드러납니다.VC에 static library 형식의 프로젝트 Lib을 새로 만들고test에 추가합니다.cpp 파일 및 테스트.h 파일 (헤더 파일에 함수 성명 포함) 을 컴파일하면 Lib가 생성됩니다.lib 파일
다른 프로젝트에서 이lib을 사용하려면 두 가지 방법이 있습니다.
(1) 프로젝트->link->Object/Library Module에 Lib를 추가합니다.lib 파일(시스템 Lib 디렉토리를 질의하기 전에 프로젝트 디렉토리를 질의);또는 소스 코드에 명령 #pragma comment(lib, "Lib.lib")를 입력합니다.
(2) Lib.lib은 프로젝트가 있는 디렉터리나 실행 파일이 생성된 디렉터리, 시스템 Lib 디렉터리에 복사합니다.
(3) 상응하는 헤더 파일 테스트를 추가합니다.h.
DLL을 사용하는 방법: 동적 링크에 있는lib을 사용합니다. obj 파일의 집합이 아닙니다. 즉, 그 안에 실제적인 실현이 없을 것입니다. 이것은 동적 링크가 DLL에 필요한 정보를 제공할 뿐입니다. 이lib는 DLL 프로젝트를 컴파일할 때 컴파일러가 생성할 수 있습니다.DLL 프로젝트를 만드는 방법(약).
(1) 암시적 링크
첫 번째 방법은 프로젝트->link->Object/Library 모듈을 통해 추가합니다.lib 파일(또는 소스 코드에 명령 #pragma comment(lib, "Lib.lib")을 추가하고dll 파일을 프로젝트가 있는 디렉터리에 넣고 대응하는 것을 추가합니다.h 헤더 파일.
#include "stdafx.h"
#include "DLLSample.h"
#pragma comment(lib, "DLLSample.lib") //
int main()
{
TestDLL(123); //dll , DllSample.h
return(1);
}
(2) 명시적 링크
함수 포인터와 WIN32 API 함수 LoadLibrary, GetProcAddress를 불러와야 합니다. 이런 불러오는 방법은 필요 없습니다.lib 파일 및.h 헤더 파일, 단지.dll 파일은 프로젝트 디렉토리에.dll 파일을 배치할 수 있습니다.
#include <iostream>
#include <windows.h> //
typedef void (*DLLFunc)(int);
int main()
{
DLLFunc dllFunc;
HINSTANCE hInstLibrary = LoadLibrary("DLLSample.dll");
if (hInstLibrary == NULL)
{
FreeLibrary(hInstLibrary);
}
dllFunc = (DLLFunc)GetProcAddress(hInstLibrary, "TestDLL");
if (dllFunc == NULL)
{
FreeLibrary(hInstLibrary);
}
dllFunc(123);
std::cin.get();
FreeLibrary(hInstLibrary);
return(1);
}
LoadLibrary 함수는 하나의 이름을 매개 변수로 삼아 DLL의 실례를 얻습니다. (HINSTANCE 형식은 실례의 핸들입니다.) 보통 이 함수를 호출한 후에 함수 반환이 성공했는지 확인하고, 성공하지 못하면 NULL (핸들이 잘못되었습니다.) 이 때 함수 FreeLibrary를 호출해서 DLL이 얻은 메모리를 방출합니다.GetProcAddress 함수는 DLL의 핸들과 함수의 이름을 매개 변수로 하고 해당하는 함수 바늘을 되돌려주며 강회전을 사용해야 한다.함수 포인터가 NULL인지 여부를 판단하고, 만약 그렇다면 함수 FreeLibrary를 호출하여 DLL에서 얻은 메모리를 방출합니다.이후 함수 바늘을 사용하여 실제 함수를 호출할 수 있다.마지막으로 FreeLibrary 함수를 사용하여 메모리를 방출하는 것을 기억해야 한다.참고 애플리케이션에서 DLL 파일을 어떻게 찾습니까?LoadLibrary 명시적 링크를 사용하면 함수의 매개 변수에서 DLL 파일의 전체 경로를 지정할 수 있습니다.경로를 지정하지 않거나 암시적 링크가 있는 경우 Windows는 다음 검색 순서에 따라 DLL을 찾습니다. (1) EXE 파일이 포함된 디렉토리(2) 엔지니어링 디렉토리(3) Windows 시스템 디렉토리(4) Windows 디렉토리(5) Path 환경 변수에 나열된 일련의 디렉토리입니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
LoadLibrary에서 126 오류가 발생하면 원인이되는 파일 이름을 찾는 방법Loadlibrary에서 DLL을 동적으로 로드할 때 로드 실패입니다. 실패한 파일 이름은 알려주지 않습니다. 로드하고자 하는 DLL 자체를 로드할 수 없다면 이야기는 간단하지만, 대상 DLL이 다른 DLL을 로드하...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.