On Saturday, 28 March 2020 at 07:33:38 UTC, Jacob Carlborg wrote:
On 2020-03-27 20:17, YD wrote:
Hi, I have a C++ header file which looks like
class A {
public:
static A *create();
virtual int f() const = 0;
};
And there is a C++ library file which provides the
implementation, so that if I write a C++ program and call
auto *p = A::create();
std::cout << p->f() << '\n';
It will work.
Now I want to interface to this C++ library through D, and I
wrote
module test;
import std.stdio;
extern(C++) {
class A {
static A *create();
abstract int f() const;
}
}
void main() {
auto p = A.create();
writeln(p.f());
}
This program will compile and link, but it core dumps at the
call to f().
If I wrap up the C++ interface into a C interface (using a
void *), and interface to the wrapped-up C library through D,
it will work fine.
So what am I doing wrong here? Thanks!
Classes in D are always passed by reference. Try dropping the
pointer in the `create` method:
static A create();
Hi, now I have a further question: when the C++ class A actually
has a method that looks like
virtual void get_info(std::string &s) const = 0;
in order to preserve the virtual function table layout (I found
that if I omit this function completely in the D declaration, and
try to use a virtual member function originally defined in C++
after this function, the result is core dump), even if I don't
use this function, in the D file I have to put in line like this
abstract void get_info(basic_string!(char) s) const;
When I try this on Linux (Ubuntu 18.04), the compiler (both dmd
and ldc2) will complain about "std::__cxx11::basic_string is not
yet supported", but otherwise the code compiles and links
correctly, and can run without problem.
But when I try this on Windows 10, dmd will simply refuse to
compile it, saying "windows c++ runtime not supported", and ldc2
will allow the compilation but fail at the linking stage, saying
something like
"error LNK2019: unresolved external symbol
__D4core6stdcpp9allocator33_Allocate_manually_vector_alignedFNixkZPv referenced in function __D4core6stdcpp9allocator__TQnTaZQs8allocateMFNikZPa"
So does this mean that there is no way I can interface to this
C++ API in Windows? Thanks.