On 2018-05-01 16:07:30 +0000, Timoses said:

On Tuesday, 1 May 2018 at 15:24:09 UTC, Robert M. Münch wrote:
Hi, I'm mostly doing simple C-API wrappers around C++ code to access thigns from D. However, I wanted to try how far I can come using C++ directly.

I have the following C++ code in namespace N:

class Image : public Object {
        Error create(int w, int h, uint32_t p) noexcept;
}
And I have the following D code:
extern (C++, N) {
class Object {
}
class Image : public Object {
uint create(int w, int h, uint pixelFormat);
}
}
So frist problem I see is, that a C++ class names Object is pretty unfortunate as this is a reserved class name in D. And DMD doesn't seem to allow using Object inside a C++ scope (which IMO should be possible). Am I right, that there is no chance to handle this case other than ranming the C++ base class?

Would `pragma(mangle, ...)` work here?
https://dlang.org/spec/pragma.html#mangle

Yes, great! Thanks. I could extend the code now. But I get a next problem:

extern (C++, b2d) {
 class AnyBase {
   bool isShared();
 }

 pragma(mangle, "Object");
 class b2dObject : AnyBase {
 }

 class Image : b2dObject {
 // class Image {
   uint create(int w, int h, uint pixelFormat);
 }
}

The linke complains about missing symbols:

error LNK2001: "public: virtual bool __cdecl b2d::AnyBase::isShared(void)" (?isShared@AnyBase@b2d@@UEBA_NXZ) error LNK2001: "public: virtual unsigned int __cdecl b2d::Image::create(int,int,unsigned int)" (?create@Image@b2d@@UEAAIHHI@Z)

I have in my C++ link lib:

?isShared@AnyBase@b2d@@QEBA_NXZ which demangles to => public: BOOL __cdecl b2d::AnyBase::isShared(void)const __ptr64

So, the difference is the "virtual" specifier on the D side, while the C++ mangeling is missing this. I have this for many functions.

Any idea how to handle this?

--
Robert M. Münch
http://www.saphirion.com
smarter | better | faster

Reply via email to