2008년 10월 6일 월요일

C에서 C++ 함수 호출하는 방법

많이 발생하는 경우는 아니지만, C에서 C++ 함수의 호출이 필요한 경우가 있다. 이런 경우에는 아래와 같은 방법으로 C++ 함수를 호출하여 사용할 수 있다.

먼저 호출하고자하는 함수를 extern "C"로 감싼다. 하지만 호출하고자 하는 함수가 클래스의 메소드일 경우에는 해당 메소드를 C 스타일의 전역 함수로 감싸야(wrapping) 한다.

//In the cpp file.
extern "C" void func_in_cpp(void);
...
extern "C"
{

 void func_in_cpp(void)
 {
  class_type class_obj_name;
  class_obj_name.class_method1();
 }
}

/* In the C file */
int main(void)
{
 ...
 func_in_cpp();
 ...
 return 0;
}

위에서와 같이 extern "C"로 선언/정의된 함수에서도 class의 instance를 만들고 사용할 수 있다. 즉 위에서와 같이 glue I/F를 만들어 주고 이를 C 프로그램에서 호출함으로써 C++ 코드안의 함수를 호출할 수 있다. 단 여기서 실행파일 생성 시 주의할 점이 있다.

glue I/F (cpp파일)나, C++ 라이브러리는 compile시 당연히 C++컴파일러로 컴파일한다. (ex. g++사용, gcc를 사용해도 확장자를 인식해 g++로 컴파일 될 것임.)

g++ -c cppfile.cpp

C++ 함수를 호출하는 C 프로그램은 당연히 C 컴파일러로 컴파일 한다. (ex. gcc 사용)

gcc -c cfile.c

마지막으로 link시 C++ library가 link되도록 옵션을 설정하여야 한다.
gcc의 경우, gcc대신 g++을 사용하여 link하면 간단하게 해결된다.

g++ -o c_application cfile.o cppfile.o

하지만 빌드 tool chain에 따라서 이를 별도의 linker옵션으로 설정해야 하는 경우도 있다.
아래는 QNX tool chain에서 제공하는 링커의 옵션을 사용한 경우의 예이다.

qcc -lang-c++ -o c_application cfile.o cppfile.o

여게서 -lang-c++은 linker옵션으로 linker에게 c++ library를 사용해야 한다고 알려준다.
gcc대신 g++을 사용해서 c++ 링커 옵션을 대신할 수 있듯이 QNX 툴도 qcc대신 QCC를 사용하면 c++ 옵션을 대신할 수 있다. 하지만 대소문자 구분이 되지 않는 Windows환경을 host 컴퓨터로 사용하고 있다면 QCC를 제대로 인식하지 못할 것이다. 이런 경우 -lang-c++을 사용해야 한다.

C에서 C++함수를 호출할 때는 몇가지 주의 사항이 있다. 이에 대한 자세한 내용은 "BINARY HACKS 해커가 전수하는 테크닉 100선, 타카바야시 사토루외 4인, O'REILLY ****" 에서 찾을 수 있다.

댓글 없음: