मैं इसे निम्नलिखित तरीके से करूंगा:
(यदि MSVC के साथ काम कर रहे हैं, तो GCC संकलन कमांड को अनदेखा करें)
मान लीजिए कि मेरे पास AAA नाम की एक C ++ क्लास है , जिसे aaa.h, aaa.cpp फ़ाइलों में परिभाषित किया गया है , और क्लास AAA में SayHi (const char * name) नाम की एक विधि है , जिसे मैं 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_sayHi (cosnt char * name) है , जो AAA के एक उदाहरण का उपयोग करेगा और इसकी विधि को कॉल करेगा:
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
अब मेरे पास एक साझा पुस्तकालय (libaaa_c_connector.so) है, जो C फ़ंक्शन AAA_sayHi (const char * name) को लागू करता है । मैं अब 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 को धन्यवाद। तवज्जो देने के लिए