PDA

View Full Version : سوال: استفاده از توابع #c در ++c



vertionality
یک شنبه 04 شهریور 1397, 11:25 صبح
سلام

من یک سری کتابخانه #c دارم ، که برای سی پلاس پلاس وجود نداره . حالا می خواهم از این کتابخانه ها در

سی پلاس پلاس استفاده کنم . امکان استفاده وجود داره ؟

کتابخانه ها به زبان جاوا ، پایتون ، جاوااسکریپت ، رابی و سی شارپ است ولی سی پلاس پلاس نداره . ممنون

( IDE::Qt )

farhad_shiri_ex
یک شنبه 04 شهریور 1397, 13:58 عصر
سلام

من یک سری کتابخانه #c دارم ، که برای سی پلاس پلاس وجود نداره . حالا می خواهم از این کتابخانه ها در

سی پلاس پلاس استفاده کنم . امکان استفاده وجود داره ؟

کتابخانه ها به زبان جاوا ، پایتون ، جاوااسکریپت ، رابی و سی شارپ است ولی سی پلاس پلاس نداره . ممنون

( IDE::Qt )

اگر کتابخانه ها DLL باشند(البته اونهایی که با سی شارپ هستند) که خوب بله به راحتی می تونید از DllImport استفاده کنید تست کد هم زیاد هست برای استفاده...
برای جاوا هم می تونید یک Shared Object یا همون so فایل تهیه کنید البته به یکسری رابط نیازدارید در حقیقت باید JAR لایبرری جاوا را به so فایل تبدیل کنید و البته در لینوکس و در ++c استفاده کنید البته تو فریم وورک qt هم می تونید ازش استفاده کنید.

vertionality
یک شنبه 04 شهریور 1397, 17:57 عصر
اگر کتابخانه ها DLL باشند(البته اونهایی که با سی شارپ هستند) که خوب بله به راحتی می تونید از DllImport استفاده کنید تست کد هم زیاد هست برای استفاده...
برای جاوا هم می تونید یک Shared Object یا همون so فایل تهیه کنید البته به یکسری رابط نیازدارید در حقیقت باید JAR لایبرری جاوا را به so فایل تبدیل کنید و البته در لینوکس و در ++c استفاده کنید البته تو فریم وورک qt هم می تونید ازش استفاده کنید.

اره اگر dll بود خوب بود . متاسفانه nupkg است ولی جاوا همه اش .jar هست . اگر جاوا ها را به so تبدیل کنم چه جوری باید برنامه اش را بنویسم با

++c بنویسم متوجه میشه کامپایلر ؟ نسخه ی exe می خواهم خیلی پلتفرم دیگر مهم نیست . ممنون

farhad_shiri_ex
سه شنبه 06 شهریور 1397, 09:12 صبح
اره اگر dll بود خوب بود . متاسفانه nupkg است ولی جاوا همه اش .jar هست . اگر جاوا ها را به so تبدیل کنم چه جوری باید برنامه اش را بنویسم با

++c بنویسم متوجه میشه کامپایلر ؟ نسخه ی exe می خواهم خیلی پلتفرم دیگر مهم نیست . ممنون

دوست عزیز !
اگر برای so. لایبرری منظورتون هست ...

#pragma once
#ifndef __PLUGIN_H__
#define __PLUGIN_H__

#include <memory>
#include <string>
#include <dlfcn.h>

class Plugin
{
public:
virtual ~Plugin() {}

virtual void func1() = 0;
virtual void func2() = 0;
};

typedef std::shared_ptr<Plugin> PluginPtr;

class PluginLoader
{
public:
PluginPtr operator()(const std::string& file);
};

#endif // __PLUGIN_H__

------------------------------------------------------------------------
#include "plugin.h"
#include <stdexcept>

PluginPtr PluginLoader::operator()(const std::string& file)
{
union { void* dl; void* dlsym; PluginPtr(*plugin)(); } get;

if(!(get.dl = dlopen(file.c_str(), RTLD_NOW|RTLD_GLOBAL)))
{
throw std::runtime_error(dlerror());
}

// Obtain pointer to the Plugin creation factory function
if(!(get.dlsym = dlsym(get.dl, "create_plugin")))
{
throw std::runtime_error(dlerror());
}

return get.plugin();
}
------------------------------------------------------------------------
#include "plugin.h"

#include <iostream>

class MyPlugin
: public Plugin
{
public:

virtual void func1()
{
std::cout << "func1()\n";
}
virtual void func2()
{
std::cout << "func2()\n";
}
};

// Factory function MUST have C linkage
extern "C" PluginPtr create_plugin()
{
return PluginPtr(new MyPlugin);
}
------------------------------------------------------------------------

#include "plugin.h"
#include <iostream>
#include <stdexcept>

int main()
{
PluginLoader load;
PluginPtr plugin;

try
{
plugin = load("build/src/.libs/myplugin.so");
if(plugin)
{
plugin->func1();
plugin->func2();
}
}
catch(std::runtime_error& e)
{
std::cout << e.what() << '\n';
}

}


توجه داشته باشید برای اینکه بتونید اشاره گرهای به تابع را تعریف کنید حتما باید بدونید که چه تابعی در لایبرری با چه امضا و چه پارامترهایی دارید که بتونید فراخوانی کنید.
مثال بالا خیلی سر راست هست !
نیاز به توضیح بود بفرمایید.