다음과 같은 방식으로 수행합니다.
(MSVC로 작업하는 경우 GCC 컴파일 명령 무시)
aaa.h, aaa.cpp 파일에 정의 된 AAA 라는 C ++ 클래스 가 있고 AAA 클래스 에 C 코드에 대해 활성화하려는 sayHi (const char * name) 이라는 메서드가 있다고 가정 합니다.
클래스 AAA 의 C ++ 코드 -순수 C ++, 수정하지 않습니다.
aaa.h
#ifndef AAA_H
#define AAA_H
class AAA {
public:
AAA();
void sayHi(const char *name);
};
#endif
aaa.cpp
#include <iostream>
#include "aaa.h"
AAA::AAA() {
}
void AAA::sayHi(const char *name) {
std::cout << "Hi " << name << std::endl;
}
이 클래스를 C ++에 대해 정기적으로 컴파일합니다. 이 코드는 C 코드에서 사용될 것이라는 것을 "모릅니다". 명령 사용 :
g++ -fpic -shared aaa.cpp -o libaaa.so
이제 C ++에서도 C 커넥터를 만듭니다. aaa_c_connector.h, aaa_c_connector.cpp 파일에서 정의합니다 . 이 커넥터는 AAA 의 인스턴스를 사용하고 해당 메소드를 호출하는 AAA_sayHi (cosnt char * name) 라는 C 함수를 정의합니다 .
aaa_c_connector.h
#ifndef AAA_C_CONNECTOR_H
#define AAA_C_CONNECTOR_H
#ifdef __cplusplus
extern "C" {
#endif
void AAA_sayHi(const char *name);
#ifdef __cplusplus
}
#endif
#endif
aaa_c_connector.cpp
#include <cstdlib>
#include "aaa_c_connector.h"
#include "aaa.h"
#ifdef __cplusplus
extern "C" {
#endif
static AAA *AAA_instance = NULL;
void lazyAAA() {
if (AAA_instance == NULL) {
AAA_instance = new AAA();
}
}
void AAA_sayHi(const char *name) {
lazyAAA();
AAA_instance->sayHi(name);
}
#ifdef __cplusplus
}
#endif
다시 일반 C ++ 컴파일 명령을 사용하여 컴파일합니다.
g++ -fpic -shared aaa_c_connector.cpp -L. -laaa -o libaaa_c_connector.so
이제 C 함수 AAA_sayHi (const char * name) 을 구현하는 공유 라이브러리 (libaaa_c_connector.so )가 있습니다. 이제 C 메인 파일을 만들고 함께 컴파일 할 수 있습니다.
main.c
#include "aaa_c_connector.h"
int main() {
AAA_sayHi("David");
AAA_sayHi("James");
return 0;
}
C 컴파일 명령을 사용하여 컴파일 :
gcc main.c -L. -laaa_c_connector -o c_aaa
$ PWD를 포함하도록 LD_LIBRARY_PATH를 설정해야하며 실행 파일 ./c_aaa를 실행하면 예상되는 출력을 얻을 수 있습니다.
Hi David
Hi James
편집하다:
일부 리눅스 배포판에, -laaa
그리고 -lstdc++
또한 마지막 컴파일 명령이 필요할 수 있습니다. @AlaaM 덕분입니다. 관심을 끌기 위해