I'm trying to wrap a C++ library and have reduced my problem case to the code below. I get a linker error due to different name mangling (this is on Linux):

main.d:(.text._Dmain+0x13): undefined reference to `_ZN3ns13ns212createStructERN3ns17OptionsE'

The C++ object file has instead a symbol called _ZN3ns13ns212createStructERNS_7OptionsE. To make matters worse and me more confused, according to https://demangler.com, they both demangle to the same thing: `ns1::ns2::createStruct(ns1::Options&)`.

If you're wondering why there's two D files it's because trying to do:

extern(C++, ns1) {... }
extern(C++, ns1.ns2) {...}

doesn't compile since there would be two D versions of ns1, which is... mildly annoying.

I even took `const` off of the parameter in case that was the problem but clearly not.

Atila


impl.cpp:


namespace ns1 {

struct Options {

};

struct Struct {

};

namespace ns2 {
ns1::Struct* createStruct(Options&) {
    return nullptr;
}

}

}


header.d:

extern(C++, ns1) {
    struct Options {

    }

    struct Struct {
    }
}


main.d:

extern(C++, ns1.ns2) {
    import header;
    Struct* createStruct(ref Options);
}


void main() {
    import header;
    Options options;
    auto s = createStruct(options);
}


Reply via email to