[Win32API] 라이브러리 구축하기 #5

2008/07/31 - [프로그래밍/Win32API/MFC] - [Win32API] 라이브러리 구축하기 #4

이어서 설명합니다.
C 컴파일러와 C++ 컴파일러의 차이점을 하나 짚어봅니다.

6. 네임 맹글링

C++ 컴파일러는 C 컴파일러와 다르게 네임 맹글링이라는 컴파일 과정을 거칩니다.
예를들어,

프로그래머가 void swap(int *a, int *b) 라는 함수를 하나 만들어뒀다면,
이것이 C++ 컴파일러를 통해 컴파일되면서 자동으로 함수 이름이 바뀌게 되는데...
_swap@#$@$234 이런식의 뷁스런 이름구조를 가지게 됩니다.

헐... 왜 이런 일을 하느냐?
그것은 C++ 의 함수 오버로딩 때문에 그렇습니다.

swap()
swap(int *a, int *b)
swap(int *a, int *b, int *c)

라는 함수를 구분하기 위해서 네임 맹글링 과정을 거치게 되는 것이죠.
C 컴파일러는 함수 오버로딩을 지원하지 않는 까닭에 네임 맹글링 과정이 없습니다.

그래서 C++ 컴파일러에서 DLL 같은 라이브러리를 구축할 때에는,
C/C++ 컴파일러 모두에서 라이브러리 사용시에 동일한 호환성을 가지도록 하기위해

extern "C" 라는 선언을 제공하고 있습니다.
이 선언이 붙은 함수는 네임 맹글링 과정을 거치지 않습니다.

지난 포스팅에서 작업한 파일을 가지고 한 가지 실험을 해보았습니다.

사용자 삽입 이미지

동적링크 라이브러리 파일은 그대로 두고,
암묵적 연결을 통해 DLL 을 사용한 BlackOx.cpp 파일의 확장자를 c 로 바꿔보았습니다.
이렇게 확장자만 cpp -> c 로 만 해도 컴파일러가 c++ -> c 컴파일러로 바뀌게 됩니다.

컴파일은 성공하나, 링킹 과정에서 오류가 발생합니다.
swap 함수를 찾을 수 없다는 머... 외부참조 오류가 발생합니다.

C 컴파일러는 네임 맹글링을 하지않기 때문에 이런 문제가 발생하는 것이죠.

그래서 동적링크 라이브러리 파일을 수정하기로 했습니다.

[4_DynamicLinkedLibrary]

- BlackOx.cpp
- BlackOx.h
지금 보니깐 느낀건데, BlackOx 라는 이름을 쓰지말걸 그랬습니다 ;;
모든 프로젝트에서 다 썼더니 헷갈리는군요.

머 암튼 DLL 프로젝트 파일을 위와 같이 extern "C" 로 수정해줍니다.
이걸 전체 빌드해주고, 다시 [5_DynamicLinkedLibrary(USE)] 를
빌드하면 이제 C 컴파일러가 정상적으로 빌드하게 됩니다.

이렇게 C++ 이 아닌 C 컴파일러로 DLL 을 구축하고 사용하는 방법을 알아봤습니다.

다음 포스팅엔 DLL 명시적 연결 프로젝트를 만듭니다.

미쉘린 프로그래밍/Win32API/MFC