라이브러리를 임포트하거나 익스포트할 경우 해당 컴파일된 라이브러리 내의 함수 심볼이 존재합니다.
당연히, 다른 프로그램에서 라이브러리를 로드해서 사용하려면 함수 이름을 알아야 합니다.
가령 리눅스도 마찬가지지만 윈도우즈를 예로 들면 LoadLibrary 로 특정 dll 파일을 로드한 후에
GetProcAddress 로 실제 함수 이름을 넘겨주어서 임포트를 하게 됩니다.
당연히 dll 파일 내에 함수 이름에 대한 정보가 있으니 이것이 가능한 것인데,
문제는 C++ 은 함수 오버로딩 등의 이유로 같은 이름의 함수가 다른 함수일 수가 있습니다.
따라서 실제 함수 심볼을 어떤 정해진 특정한 규칙에 따라 다르게 생성합니다.
C 에서는 단순히 보통 함수 앞에 언더바(_) 하나만 붙여서 표현했기 때문에 가령 func 라는 함수에 대한
심볼은 실제로 _func 로 저장되어 있었습니다. 그러나 C++ 에서는 그렇지 않기 때문에, C와 C++ 로
각각 만들어진 라이브러리를 임포트할 경우 이 심볼을 제대로 파싱하지 못하면 당연히 임포트도 불가능합니다.
따라서 extern "C" 라는 것을 앞에 붙여주는 규칙을 만들어서, 이것이 앞에 붙어있을 경우 C++ 컴파일러에서
함수 심볼을 C++ 스타일로 검색하지 않고 C 스타일로 검색하거나 생성하게 됩니다.
보시다시피 #ifdef __cplusplus 의 경우, C++ 컴파일러는 __cplusplus 매크로를 자동으로 정의하므로
이 매크로가 있는 경우에는 extern "C" 로 묶는 스코프를 생성하여 심볼을 전부 C 스타일로 생각하게 됩니다.
?
라이브러리를 임포트하거나 익스포트할 경우 해당 컴파일된 라이브러리 내의 함수 심볼이 존재합니다.
당연히, 다른 프로그램에서 라이브러리를 로드해서 사용하려면 함수 이름을 알아야 합니다.
가령 리눅스도 마찬가지지만 윈도우즈를 예로 들면 LoadLibrary 로 특정 dll 파일을 로드한 후에
GetProcAddress 로 실제 함수 이름을 넘겨주어서 임포트를 하게 됩니다.
당연히 dll 파일 내에 함수 이름에 대한 정보가 있으니 이것이 가능한 것인데,
문제는 C++ 은 함수 오버로딩 등의 이유로 같은 이름의 함수가 다른 함수일 수가 있습니다.
따라서 실제 함수 심볼을 어떤 정해진 특정한 규칙에 따라 다르게 생성합니다.
C 에서는 단순히 보통 함수 앞에 언더바(_) 하나만 붙여서 표현했기 때문에 가령 func 라는 함수에 대한
심볼은 실제로 _func 로 저장되어 있었습니다. 그러나 C++ 에서는 그렇지 않기 때문에, C와 C++ 로
각각 만들어진 라이브러리를 임포트할 경우 이 심볼을 제대로 파싱하지 못하면 당연히 임포트도 불가능합니다.
따라서 extern "C" 라는 것을 앞에 붙여주는 규칙을 만들어서, 이것이 앞에 붙어있을 경우 C++ 컴파일러에서
함수 심볼을 C++ 스타일로 검색하지 않고 C 스타일로 검색하거나 생성하게 됩니다.
보시다시피 #ifdef __cplusplus 의 경우, C++ 컴파일러는 __cplusplus 매크로를 자동으로 정의하므로
이 매크로가 있는 경우에는 extern "C" 로 묶는 스코프를 생성하여 심볼을 전부 C 스타일로 생각하게 됩니다.
댓글 달기