본문 바로가기

👩‍💻 도비는 공부중/💼 하계연구연수생(2023)

[C/C++] Dynamic-link Libraries (in Windows)

Modularize program > seperate components > ease deployment & installation

 

https://medium.com/ai-innovation/how-to-create-c-c-dynamic-link-libraries-in-windows-28abefc988c9

1. Setup

윈도우에서 Shared libraries는 dynamic-link libraries (.dll) 이라고 부른다.

다른 플랫폼에서 shared object 는 .so 확장자를 사용한다.

 

2. Implementation

root

   |_ include

   |_ obj

   |_ src

 

- include: 헤더 파일 저장, 컴파일된 공유 라이브러리와 상호작용 하는 방법에 대한 참조

- obj: 컴파일 중 생성된 임시 obj 파일 저장. (안전하게 삭제 가능)

- src: 함수 필수 코드 저장, 배포하는 동안 패키지에서 이러한 파일 제외

 

Header

 

include

|_add.h

#ifndef _ADD_H
#define _ADD_H
extern "C"
{
    __declspec(dllexport) int add(int, int);
    __declspec(dllexport) int sub(int, int);
    __declspec(dllexport) int mul(int, int);
}
#endif

 

Implementation code

 

src

|_add.cpp

#include "add.h"
extern "C"
{
    __declspec(dllexport) int add(int a, int b) 
    {
        return a + b;
    }
    __declspec(dllexport) int sub(int a, int b)
    {
        return a - b;
    }
    __declspec(dllexport) int mul(int a, int b)
    {
        return a * b;
    }
}

 

Main

 

include

obj

src

main.cpp

#include <iostream>
#include "add.h"
int main() {
    std::cout << add(2, 2) << " | " << sub(3, 1) << " | " << mul(3, 3) << std::endl;
    return 0;
}

 

Object Files

cl /EHsc /c .\src\*.cpp /I .\include /Fo".\obj\\"

/c: 소스 파일 위치

/I: 헤더 파일 위치

/Fo: 컴파일 중 생성될 임시 obj 파일 위치

 

 

Dynamic-link libraries

link /DLL /OUT:add.dll .\obj\*.obj

include

obj

src

add.dll

add.exp

add.lib

main.cpp

 

add.dll - shared library for program

add.exp - export library program

add.lib - static libarary

 

 

Executable file

마지막 실행 파일 만들기!

cl /EHsc main.cpp /Fetest.exe /I .\include /link *.lib

include

obj

src

add.dll

add.exp

add.lib

main.cpp

main.obj

test.exe