On 3/8/18 11:23 AM, Markus wrote:
On Thursday, 8 March 2018 at 15:27:31 UTC, Markus wrote:
Hi

I got the following c++ code [lib.cpp]:
namespace ns_a
{
  class class_a {
  };
  void some_function(class_a*) {;}
}

and the following d code [main.d]:
extern (C++, namespace_a) {
    class class_a {}
    void some_function(class_a);
}
void main() {
    namespace_a.class_a instance_a;
    namespace_a.some_function(instance_a);
}

I'm compiling lib.cpp to a shared library by:
g++ -shared lib.cpp -o libissue.so
and I'm building and linking it with main.d by
dmd main.d -L-lissue -L-L.

Then I get the error:
main.o: In function `_Dmain':
main.d:(.text._Dmain[_Dmain]+0xa): undefined reference to `namespace_a::some_function(namespace_a::class_a*)'
collect2: error: ld returned 1 exit status
Error: linker exited with status 1

When I move the c++ class_a to another namespace (eg. to namespace_b), I'm able to compile and link!
readelf -Ws libissue.so | grep some_function
gives me
_ZN4ns_a13some_functionEPNS_7class_aE
so I don't see any issue. Any idea what I'm missing? I guess some linker flag when compiling libissue.so

Cheers,
Markus

https://forum.dlang.org/thread/mailman.2458.1448772039.22025.digitalmar...@puremagic.com
seems to describe my issue.
To quote Walter Wright
D does not support C++ semantics. You cannot split namespaces into multiple files in D, nor can you add symbols to an existing namespace. For namespace NS, all the declarations in NS have to be in one file and between the { }, just like any other scope in D.
in my opinion, that's really annoying for C++ wrapper devs.

Hm... that is over 2 years old. I would agree it would seem like a bad limitation.

And the error message doesn't seem like a linker error, whereas yours does. If it gets to the linker, D hasn't complained about it.

-Steve

Reply via email to