__init unresolved external when using C library structs converted with dstep

Steven Schveighoffer schveiguy at gmail.com
Tue Apr 14 18:44:55 UTC 2020

On 4/14/20 2:29 PM, Robert M. Münch wrote:
> On 2020-04-14 18:23:05 +0000, Steven Schveighoffer said:
>> On 4/14/20 1:51 PM, Robert M. Münch wrote:
>>> I use a C libary and created D imports with dstep. It translates the 
>>> C structs to D structs.
>>> When I now use them, everything compiles fine but I get an unresolved 
>>> external error:
>>> WindowsApp1.obj : error LNK2019: unresolved external symbol 
>>> "myCstruct.__init" (_D7myCStruct6__initZ) referenced in function _Dmain
>>> Any idea what this is about and how to fix it? I'm wondering why D 
>>> tries to find the __init function in the C library and not compile it 
>>> from the import.
>> __init is not a function, it's a static member variable. It's the 
>> `intializer` property inside TypeInfo used for initialization.
> Ah, ok. That's why the problem went (temporarly) away when I did a: 
> myCstruct a = {0,0}; for example?

I don't know what causes it to be emitted when. Sometimes it doesn't 
make a whole lot of sense to me.

>> Did you extern(C) the struct?
> Yes, everything is "extern(C) :" for the complete import files.

Then apparently the compiler still expects to have initializers even for 
foreign language structs. This is not a huge issue though, as the 
structs are ABI compatible even if compiled in D.

>> Are you compiling the D file that contains the struct definition as well?
> No. Is that the missing part?

Probably. I think the compiler expects whatever is compiling the 
imported file to provide the symbol. If you aren't compiling it 
separately, then you need to include it in the compilation.


More information about the Digitalmars-d-learn mailing list