আমি এটি নিম্নলিখিত উপায়ে করব:
(যদি এমএসভিসির সাথে কাজ করে থাকে তবে জিসিসি সংকলনের আদেশগুলি উপেক্ষা করুন)
মনে করুন যে আমার কাছে AAA নামের একটি সি ++ ক্লাস রয়েছে, এটি aaa.h, aaa.cpp ফাইলগুলিতে সংজ্ঞায়িত হয়েছে এবং ক্লাস AAA এর একটি পদ্ধতি sayHi (কনস্ট চর * নাম) রয়েছে যা আমি সি কোডের জন্য সক্ষম করতে চাই।
এএএ শ্রেণির সি ++ কোড - খাঁটি সি ++, আমি এটিকে সংশোধন করি না:
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;
}
এই ক্লাসটি নিয়মিত সি ++ এর জন্য করা হিসাবে সংকলন করা হচ্ছে। এই কোডটি "জানেন না" এটি সি কোড দ্বারা ব্যবহৃত হতে চলেছে। কমান্ডটি ব্যবহার করে:
g++ -fpic -shared aaa.cpp -o libaaa.so
এখন, সি ++ তেও সি সংযোগকারী তৈরি করুন। এটি aaa_c_connector.h, aaa_c_connector.cpp ফাইলগুলিতে সংজ্ঞায়িত করা হচ্ছে । এই সংযোজকটি AAA_sayHi (কাস্টেন্ট চর * নাম) নামে একটি সি ফাংশন সংজ্ঞায়িত করতে চলেছে , এটি এএএর উদাহরণ ব্যবহার করবে এবং এর পদ্ধতিটি কল করবে:
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
এটি নিয়মিত সি ++ সংকলন কমান্ড ব্যবহার করে আবার সংকলন করুন:
g++ -fpic -shared aaa_c_connector.cpp -L. -laaa -o libaaa_c_connector.so
এখন আমার কাছে একটি ভাগ করা লাইব্রেরি রয়েছে (libaaa_c_connector.so), এটি সি ফাংশন এএএ_সায়হি (কনস্ট চর * নাম) প্রয়োগ করে । আমি এখন একটি সি প্রধান ফাইল তৈরি করতে এবং এগুলি সমস্ত একসাথে সংকলন করতে পারি:
main.c
#include "aaa_c_connector.h"
int main() {
AAA_sayHi("David");
AAA_sayHi("James");
return 0;
}
এটি একটি সি সংকলন কমান্ড ব্যবহার করে সংকলন করুন:
gcc main.c -L. -laaa_c_connector -o c_aaa
$ পিডাব্লুডি রাখার জন্য আমার এলডি_লিবিআরএইপিএটিএল সেট করতে হবে এবং যদি আমি এক্সিকিউটেবল চালাও / / সি_আআআআআআ , আমি প্রত্যাশিত আউটপুটটি পেয়ে যাব:
Hi David
Hi James
সম্পাদনা:
কিছু লিনাক্স বিতরণে -laaa
এবং -lstdc++
শেষ সংকলন কমান্ডের জন্যও প্রয়োজনীয় হতে পারে। ধন্যবাদ আলআমকে। মনোযোগের জন্য