如何在D中从库中导入类? 有什么我做错了吗?我已经成功地从dll到libs导入了函数,但从未成为类。
尝试从.lib导入一个类来获取这些错误:
public class WebViewRender : WebViewRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<WebView> e)
{
base.OnElementChanged(e);
if (Control != null)
{
var webView = Control as Android.Webkit.WebView;
Dictionary<string, string> headers = new Dictionary<string, string>
{
["Name"] = "value"
};
webView.SetWebViewClient(new MyWebViewClient());
webView.LoadUrl(Control.Url, headers);
}
}
}
public class MyWebViewClient : WebViewClient
{
public override bool ShouldOverrideUrlLoading(Android.Webkit.WebView view, string url)
{
Dictionary<string, string> headers = new Dictionary<string, string>
{
["Name"] = "value"
};
view.LoadUrl(url, headers);
return true;
}
}
以下是我尝试导入类的方法,我认为这些是正确的定义,但可能是错误的:
main.obj : error LNK2019: unresolved external symbol "public: void __cdecl Magick::Image::write(char const *)" (?write@Image@Magick@@QEAAXPEBD@Z) referenced in function _Dmain
main.exe : fatal error LNK1120: 1 unresolved externals
这是我尝试在D中导入的功能:
pragma(lib, "library.lib");
extern (C++){
Image createImage(const(char)*);
void deleteImage(ref Image d);
}
pragma(lib, "C:/Program Files/ImageMagick-7.0.5-Q16/lib/CORE_RL_Magick++_.lib");
pragma(lib, "C:/Program Files/ImageMagick-7.0.5-Q16/lib/CORE_RL_MagickCore_.lib");
pragma(lib, "C:/Program Files/ImageMagick-7.0.5-Q16/lib/CORE_RL_MagickWand_.lib");
extern (C++,Magick){
void InitializeMagick(const(char)*);
//void InitializeMagick(const(char)* __ptr64);
class Image{
//There are errors trying to import any constructor or function
//this();
//this(const(char)*);
final void write(const(char)*);
}
}
int main(string[] args){
Magick.InitializeMagick("");
Magick.Image img = createImage("screenshot:");
img.write("file.jpg"); //linking problems after adding this line
return 0;
}
答案 0 :(得分:1)
类write
的构造函数和Image
方法都采用std :: string而不是char*
。您未收到来自createImage
的投诉,因为它会将char*
转换为std::string
,但您会收到来自Image.write
的投诉,因为D编译器无法转换{{1}转到char*
。
您需要向d编译器讲授std::string
并围绕std::string
制作包装器,方法与std::string
相同。
如果你在堆上的cpp端创建Magick::Image
并且只传递一个指针,那么你可以在没有太多样板的情况下使用它。这是一个例子:
std::string
// wrapper.cpp
#include <Magick++.h>
#include <string>
Magick::Image* createImage(const std::string &imageSpec_)
{
return new Magick::Image(imageSpec_);
}
void deleteImage(Magick::Image *&image)
{
delete image;
image = NULL;
}
std::string* createCppString(const char *s)
{
return new std::string(s);
}
void deleteCppString(std::string *&sp)
{
delete sp;
sp = NULL;
}
但是如果你想在堆栈上创建// imm.d
pragma(lib, "wrapper.lib");
extern (C++, std)
{
// std::string boilerplate
struct allocator(T);
struct char_traits(CharT);
struct basic_string(CharT, Traits=char_traits!CharT, Allocator=allocator!CharT);
alias string = basic_string!char;
}
pragma(lib, "C:/Program Files/ImageMagick-7.0.5-Q16/lib/CORE_RL_Magick++_.lib");
pragma(lib, "C:/Program Files/ImageMagick-7.0.5-Q16/lib/CORE_RL_MagickCore_.lib");
pragma(lib, "C:/Program Files/ImageMagick-7.0.5-Q16/lib/CORE_RL_MagickWand_.lib");extern (C++, Magick)
{
void InitializeMagick(const(char)*);
class Image
{
@disable this();
final void write(ref const(std.string));
}
}
extern (C++)
{
Magick.Image createImage(ref const(std.string));
void deleteImage(ref Magick.Image);
std.string* createCppString(const(char)*);
void deleteCppString(ref std.string*);
}
void main() {
Magick.InitializeMagick("");
auto imgsrc = "screenshot:".createCppString;
scope(exit) deleteCppString(imgsrc);
Magick.Image img = createImage(*imgsrc);
scope(exit) deleteImage(img);
auto filename = "file.jpg".createCppString;
scope(exit) deleteCppString(filename);
img.write(*filename);
}
(在cpp一侧)并通过vale传递它而不是绕过指针你需要更多的锅炉板,你需要填写std::string
base_string
这是做到这一点的最佳方式,但祝你好运(struct basic_string(CharT, Traits=char_traits!CharT, Allocator=allocator!CharT);
{
// fill in the fields ...
}
不是很友好),但你可以让工具为你做一些艰苦的工作,例如htod。