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/[email protected]
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.
I failed to describe my issue in the first post.
there has to be another.d
the function and class have to be in seperate d files.
Sorry for the spam