Hi,
I'm still trying to make a POC to get some bullets to prove that Rust is viable and can improve our lifes in my company, but for that, I need to interact with an existing house (ill-)made SDK which is part C, part C++.
For interacting with the C++, I had to write a C-wrapper because the C++ code is so weird and so Windows specific that bindgen is totally lost. I manage to wrap many many thing and so near from having the final prototype, I'm stuck in a linker problem.
the SDK provide this abstract class:
class __declspec(dllimport) BaseClass
{
public:
BaseClass(/*...*/);
void Start();
protected:
virtual void toOverride() = 0;
}
in a C static lib, I'm implementing a concrete class:
class MyClass: public BaseClass {
protected:
void toOverride() override;
}
MyClass::MyClass() : BaseClass(/*...*/) {}
MyClass::toOverride() {
// bla bla
}
and wrapping it in C functions:
extern "C" {
MyClass* MyClass_new();
void MyClass_delete(MyClass* ptr);
void MyClass_toOverride(MyClass* ptr);
}
Then I'm using bindgen on my CWrapperLib and try to build the POC, which is a DLL (cdylib) to be loaded by the existing platform.
My issue is at linking time:
CWrapperLib.lib : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall BaseClass::BaseClass(/*...*/)
and another one for the Start method, very similar.
I'm assumption is that this __declspec(dllimport) screw things up because I'm implementing it in a static lib that I am intendind to link to my Rust produced DLL.
In pure C++ implementation, I've seen that the BaseClass is implemented in a DLL.
So my question is: can I get over this issue or do I need a C++ DLL that load a Rust static lib and not the other way around?
Thank you