C++ interop, abstract struct problem
RSY
rsy_881 at gmail.com
Mon Dec 28 15:42:26 UTC 2020
Hello
I try to use a C++ lib
So far so good, i managed to use that lib and get started
The problem however is this:
C++ API:
```
void preinit(IAllocator& allocator, bool load_renderdoc);
```
``IAllocator`` is an abstract struct, (a struct with virtual
functions)
But the problem is D doesn't allow that, so apparently i need to
use an abstract class and wrap it using: ``extern (C++, struct)``
The problem is, when passing the object to the function i get:
``dumix.obj : error LNK2019: unresolved external symbol "void
__cdecl Lumix::gpu::preinit(struct Lumix::IAllocator *,bool)"
(?preinit at gpu@Lumix@@YAXPEAUIAllocator at 2@_N at Z) referenced in
function _Dmain ``
Wich is wrong, it is supposed to pass as a reference, i don't
know why it is picky
Do you guys have an idea what i do wrong, or what i should do?
Thanks!
Here is the full code:
```
import std.stdio;
import core.thread;
import core.stdc.stdio;
import core.memory;
extern (C++, Lumix) @nogc nothrow
{
extern (C++, os) @nogc nothrow
{
struct InitWindowArgs
{
enum Flags
{
NO_DECORATION = 1 << 0,
NO_TASKBAR_ICON = 1 << 1
}
const(char)* name = "hello lumix";
bool handle_file_drops = false;
bool fullscreen = false;
uint flags = 0;
void* parent = null;
}
void* createWindow(const ref InitWindowArgs);
}
align(8) struct Mutex
{
ubyte[8] data;
}
extern (C++, struct) abstract class IAllocator
{
void* allocate(size_t n);
void deallocate(void* p);
void* reallocate(void* ptr, size_t size);
void* allocate_aligned(size_t size, size_t alignn);
void deallocate_aligned(void* ptr);
void* reallocate_aligned(void* ptr, size_t size, size_t
alignn);
}
extern (C++, struct) class DefaultAllocator : IAllocator
{
ubyte* m_small_allocations = null;
void*[4] m_free_lists;
uint m_page_count = 0;
Mutex m_mutex;
override void* allocate(size_t n);
override void deallocate(void* p);
override void* reallocate(void* ptr, size_t size);
override void* allocate_aligned(size_t size, size_t
alignn);
override void deallocate_aligned(void* ptr);
override void* reallocate_aligned(void* ptr, size_t size,
size_t alignn);
}
extern (C++, gpu) @nogc nothrow
{
enum InitFlags : uint
{
NONE = 0,
DEBUG_OUTPUT = 1 << 0,
VSYNC = 1 << 1
}
// 1505C2 ?preinit at gpu@Lumix@@YAXAEAUIAllocator at 2@_N at Z
void preinit(IAllocator allocator, bool load_renderdoc);
bool init(void* window_handle, InitFlags flags);
void* allocProgramHandle();
}
}
void main()
{
auto arg = InitWindowArgs();
auto win = Lumix.os.createWindow(arg);
IAllocator allocator = new DefaultAllocator();
Lumix.gpu.preinit(allocator, false);
Lumix.gpu.init(win, InitFlags.NONE);
while (true)
{
Thread.sleep(usecs(1));
}
}
```
More information about the Digitalmars-d-learn
mailing list