[Win32API] 라이브러리 구축하기 #5
2008/07/31 20:18
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 명시적 연결 프로젝트를 만듭니다.
이어서 설명합니다.
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' 카테고리의 다른 글
| [System] 아스키코드와 유니코드 #3 (1) | 2008/08/04 |
|---|---|
| [System] 아스키코드와 유니코드 #2 (0) | 2008/08/04 |
| [System] 아스키코드와 유니코드 #1 (0) | 2008/08/04 |
| [Win32API] 라이브러리 구축하기 #7 (전체소스 첨부) (0) | 2008/08/03 |
| [Win32API] 라이브러리 구축하기 #6 (2) | 2008/08/01 |
| [Win32API] 라이브러리 구축하기 #5 (0) | 2008/07/31 |
| [Win32API] 라이브러리 구축하기 #4 (0) | 2008/07/31 |
| [Win32API] 라이브러리 구축하기 #3 (1) | 2008/07/31 |
| [Win32API] 라이브러리 구축하기 #2 (0) | 2008/07/31 |
| [Win32API] 라이브러리 구축하기 #1 (0) | 2008/07/31 |
| [System] Stored Program Concept (0) | 2008/07/30 |



