개발/WIN32-MFC

DLL 시리즈 #2 명시적 연결 vs 묵시적 연결

-=HaeJuK=- 2024. 9. 12. 13:52

DLL 명시적 연결 vs 묵시적 연결

1. 묵시적 연결 (Implicit Linking)

묵시적 연결은 프로그램이 실행될 때, 자동으로 DLL이 로드되는 방식입니다. 즉, 프로그램 시작 시 필요한 모든 DLL이 자동으로 메모리에 로드됩니다. 이를 위해서는 컴파일 시점에 DLL의 함수 시그니처가 필요하며, .lib 파일을 링크해야 합니다.

묵시적 연결 코드 예시

// main.cpp
#include <iostream>
#include "MyDLL.h" // DLL에서 제공하는 헤더 파일

int main() {
    // 묵시적 연결로 DLL의 함수를 호출
    int count = GetCount();
    std::cout << "Count from DLL: " << count << std::endl;
    
    return 0;
}

2. 명시적 연결 (Explicit Linking)

명시적 연결은 프로그램이 실행된 후에, 필요할 때 DLL을 동적으로 로드하는 방식입니다. 이 방식은 LoadLibrary()GetProcAddress()를 사용하여 DLL을 명시적으로 로드하고, 함수 주소를 가져와 호출합니다.

명시적 연결 코드 예시

// main.cpp
#include <iostream>
#include <Windows.h>

typedef int (*GetCountFunc)();

int main() {
    // DLL을 명시적으로 로드
    HMODULE hDll = LoadLibrary("MyDLL.dll");
    if (!hDll) {
        std::cerr << "Failed to load DLL" << std::endl;
        return 1;
    }

    // GetCount 함수의 주소를 가져옴
    GetCountFunc GetCount = (GetCountFunc)GetProcAddress(hDll, "GetCount");
    if (!GetCount) {
        std::cerr << "Failed to get function address" << std::endl;
        FreeLibrary(hDll);
        return 1;
    }

    // GetCount 함수를 호출
    int count = GetCount();
    std::cout << "Count from DLL: " << count << std::endl;

    // DLL을 해제
    FreeLibrary(hDll);

    return 0;
}

묵시적 연결 vs 명시적 연결 비교

구분 묵시적 연결 명시적 연결
로딩 시점 프로그램 실행 시 프로그램 실행 중 필요할 때
DLL 로딩 방식 자동 로드 LoadLibrary()를 통해 수동 로드
필요 파일 .lib 파일이 필요 .lib 파일 없이 DLL만 필요
함수 호출 일반 함수처럼 호출 가능 GetProcAddress()로 함수 주소를 가져와 호출
유연성 낮음 (프로그램 실행 시 모든 DLL이 로드됨) 높음 (필요한 시점에만 DLL을 로드 가능)

결론

묵시적 연결은 프로그램이 실행될 때 모든 필요한 DLL을 한 번에 로드하기 때문에 설정이 간단하지만, 실행 시에 불필요한 DLL도 모두 로드될 수 있습니다. 반면 명시적 연결은 프로그램 실행 중 필요한 시점에서 DLL을 로드할 수 있어 메모리 사용 측면에서 효율적이며, 유연하게 사용할 수 있습니다. 각 방식은 상황에 따라 적절하게 선택해야 합니다.

반응형