Re: Bind C++ class to DLang : undefined reference to `Canvas::Foo()'

2020-07-15 Thread Jacob Carlborg via Digitalmars-d-learn

On 2020-07-14 05:33, Boris Carvajal wrote:

Can you try passing -D_GLIBCXX_USE_CXX11_ABI=0 to g++ and 
-version=_GLIBCXX_USE_CXX98_ABI to dmd.


That comes from: https://dlang.org/changelog/2.088.0.html#std_string

C++11 ABI is currently not supported.


I based on previous messages and the usage of Clang, I think zoujiaqing 
is using a Mac. On Mac libc++ is used. That above might not apply.


--
/Jacob Carlborg


Re: Bind C++ class to DLang : undefined reference to `Canvas::Foo()'

2020-07-13 Thread Boris Carvajal via Digitalmars-d-learn

On Monday, 13 July 2020 at 16:17:55 UTC, zoujiaqing wrote:

On Monday, 13 July 2020 at 12:57:52 UTC, Adam D. Ruppe wrote:

On Monday, 13 July 2020 at 09:34:35 UTC, zoujiaqing wrote:

# dmd source/main.d Canvas.o -L-lstdc++ && ./main
[1]49078 segmentation fault  ./main


On my computer I got this warning out of the compiler:

libstdc++ std::__cxx11::basic_string is not yet supported; the 
struct contains an interior pointer which breaks D move 
semantics!



sounds like it might be a known limitation.


Thanks Adam, but D link to C++ very hard?


Can you try passing -D_GLIBCXX_USE_CXX11_ABI=0 to g++ and 
-version=_GLIBCXX_USE_CXX98_ABI to dmd.


That comes from: 
https://dlang.org/changelog/2.088.0.html#std_string


C++11 ABI is currently not supported.


Re: Bind C++ class to DLang : undefined reference to `Canvas::Foo()'

2020-07-13 Thread evilrat via Digitalmars-d-learn

On Monday, 13 July 2020 at 09:34:35 UTC, zoujiaqing wrote:

I changed string to basic_string.

///  source/main.d
import std.stdio;
import core.stdcpp.string;

extern(C++)
{
class Canvas
{
@disable this();

static Canvas Create();

basic_string!ubyte Foo();

basic_string!ubyte Bar();
};
}

void main()
{
Canvas canvas = Canvas.Create();

writeln(canvas.Foo());

writeln(canvas.Bar());
}

Error ...

# dmd source/main.d Canvas.o -L-lstdc++ && ./main
[1]49078 segmentation fault  ./main


Putting std::string support aside there is another issue in this 
example. D has virtual by default semantic unlike C++.


One possible segfault reason is that because it tries to call non 
existing virtual method.


Marking those D methods 'final' should fix linking issues. Also I 
can't remember if extern(C++) is implicitly propagated to class 
methods so I would put extern(C++) in class body just to be sure.




Re: Bind C++ class to DLang : undefined reference to `Canvas::Foo()'

2020-07-13 Thread zoujiaqing via Digitalmars-d-learn

On Monday, 13 July 2020 at 12:57:52 UTC, Adam D. Ruppe wrote:

On Monday, 13 July 2020 at 09:34:35 UTC, zoujiaqing wrote:

# dmd source/main.d Canvas.o -L-lstdc++ && ./main
[1]49078 segmentation fault  ./main


On my computer I got this warning out of the compiler:

libstdc++ std::__cxx11::basic_string is not yet supported; the 
struct contains an interior pointer which breaks D move 
semantics!



sounds like it might be a known limitation.


Thanks Adam, but D link to C++ very hard?


Re: Bind C++ class to DLang : undefined reference to `Canvas::Foo()'

2020-07-13 Thread Adam D. Ruppe via Digitalmars-d-learn

On Monday, 13 July 2020 at 09:34:35 UTC, zoujiaqing wrote:

# dmd source/main.d Canvas.o -L-lstdc++ && ./main
[1]49078 segmentation fault  ./main


On my computer I got this warning out of the compiler:

libstdc++ std::__cxx11::basic_string is not yet supported; the 
struct contains an interior pointer which breaks D move semantics!



sounds like it might be a known limitation.


Re: Bind C++ class to DLang : undefined reference to `Canvas::Foo()'

2020-07-13 Thread zoujiaqing via Digitalmars-d-learn

I changed string to basic_string.

///  source/main.d
import std.stdio;
import core.stdcpp.string;

extern(C++)
{
class Canvas
{
@disable this();

static Canvas Create();

basic_string!ubyte Foo();

basic_string!ubyte Bar();
};
}

void main()
{
Canvas canvas = Canvas.Create();

writeln(canvas.Foo());

writeln(canvas.Bar());
}

Error ...

# dmd source/main.d Canvas.o -L-lstdc++ && ./main
[1]49078 segmentation fault  ./main



Bind C++ class to DLang : undefined reference to `Canvas::Foo()'

2020-07-12 Thread zoujiaqing via Digitalmars-d-learn



/// Canvas.hpp

#include ;

class Canvas
{
static Canvas* Create();

std::string Foo();

std::string Bar();
};



/// Canvas.cpp

#include "Canvas.hpp"

#include 

Canvas* Canvas::Create()
{
return new Canvas();
}

std::string Canvas::Foo()
{
return "Foo";
}

std::string Canvas::Bar()
{
return "Bar";
}



/// main.d

import std.stdio;

extern(C++)
{
class Canvas
{
@disable this();

static Canvas Create();

string Foo();

string Bar();
};
}

void main()
{
Canvas canvas = Canvas.Create();

writeln(canvas.Foo());

writeln(canvas.Bar());
}



# clang++ -I./include/ -fPIE -c src/Canvas.cpp
# dmd source/main.d Canvas.o -L-lstdc++ && ./main
/usr/bin/ld: main.o:(.data._D4main6Canvas6__vtblZ+0x0): undefined 
reference to `Canvas::Foo()'
/usr/bin/ld: main.o:(.data._D4main6Canvas6__vtblZ+0x8): undefined 
reference to `Canvas::Bar()'

collect2: error: ld returned 1 exit status
Error: linker exited with status 1