[C++] DLL 연결 (암시적 링크)

Kim Dongil·2023년 12월 29일
0

C++

목록 보기
23/23

DLL 프로젝트를 새로 만든다.

사용할 DLL 을 만들기 위해서 먼저 프로젝트를 만든다.

정말 간단한 사칙연산 정도만 만들어 볼 것이기에 불필요한 파일과 폴더는 전부 지우고 Math.h 를 만든다.

호출규약 (calling convention)

이제 DLL을 빌드하면 .dll이 Debug 폴더안에 만들어 질텐데 이것만 있어서는 안된다.
exe파일에 .dll을 연결하기위해서는 .lib로 연결을 시켜야하는데 .lib가 만들어지기 위해서는 DLL프로젝트에서 외부에서 사용한다는것을 명시적으로 나타내야 한다.
이를 호출 규약(calling convention) 이라고 한다.

DLL에서 함수를 명시적으로 내보내기 위해 declspec(dllexport)를 사용하고, 외부에서 DLL을 사용하는 프로젝트에서는 declspec(dllimport)와 함께 호출 규약을 명시해야 합니다.

이를 편하게 하기 위해서 매크로로 만들어두면 편리하다.

우선 _WINDLL 은 전처리기가 정의되어 있는지 확인하기 위함인데 프로젝트 속성 -> C/C++ -> 전처리기 -> 전처리기 정의 옵션에서 새로 만들어서 사용하거나 _WINDLL 처럼 기본으로 구성되어있는 친구를 사용하면된다. 이는 프로젝트 생성시 전처리기 정의가 되는건데 이를 통하여 DLL을 빌드해서 내보낼때는 dllexport DLL을 외부에서 사용할때는 dllimport 를 하게된다.

declspec(dllexport)와 declspec(dllimport) 키워드

declspec(dllexport) 키워드가 붙은 함수는 DLL 외부로 노출된다. 즉, DLL을 사용하여 declspec(dllexport) 키워드가 붙은 함수를 호출할 수 있다는 의미. 이와 반대로, 해당 키워드가 없는 함수는 정의되어 있어도 DLL 외부에서 호출할 수 없다.

declspec(dllimport) 키워드는 DLL에 정의된 함수를 호출하기 위해 사용된다. 즉, DLL에서 declspec(dllexport)로 정의된 함수를 __declspec(dllimport)로 호출한다는 것.

extern "C" 키워드

extern "C" 키워드를 설명하기에 앞서, 네임 맹글링(Name Mangling)에 대해 알아야한다. 네임 맹글링이란, 컴파일러가 함수의 이름을 일정한 규칙을 가지고 변형하는 것을 의미한다. C++에서는 C와는 다르게 함수 오버로딩을 지원하는데 즉, 동일한 함수의 이름이라도 매개변수에 따라 링커는 다르게 구분하게 된다. 따라서 같은 이름의 함수가 여러 개 존재할 때 어떤 함수를 호출할지 구분해서 링크하기 위해 컴파일러가 이름을 변형하게 된다. 그래서 맹글링이 적용된다.

그런데 DLL을 사용하여 명시적 링킹(Explicit Linking)을 할 경우 호출할 함수의 이름을 알아야 하는데요. 함수의 이름이 DLL로 생성되면서 맹글링 되면 호출하기가 어렵다. 그래서 extern "C" 키워드를 붙여 네임 맹글링을 수행하지 않겠다고 정의하는 것이다.

DLL 빌드

이제 DLL 프로젝트를 빌드하면 .lib 와 .dll이 만들어진다.

빈 프로젝트 생성 (DLL 연결)

이제 이 dll을 사용하기 위한 exe를 만들어내기 위해서 빈 프로젝트를 하나 만든다.

추가 종속성과 추가 라이브러리 디렉터리로 어떤 lib를 연결하고 어디에 위치해있는지 알려주고

이렇게 DLL로 만들어진 Add 함수를 호출하면 암시적 링크가 되어있기에 문제 없이 성공한다.

C++ DLL 생성하기

0개의 댓글

관련 채용 정보