Cycle detected between modules with ctors/dtors

Mandeep mandeep at brars.co.in
Sat Apr 23 04:27:23 PDT 2011


On 04/23/2011 02:04 PM, Jonathan M Davis wrote:
>> Hi,
>>
>> I am trying to compile the code that was working with dmd 2.050 using
>> dmd 2.052.
>>
>> The code compiles but it gives me errors with message when trying to run:
>>
>> Cycle detected between modules with ctors/dtors
>>
>> This was not happening earlier with 2.050. I am not able to produce a
>> smaller test case for this but it is happening with a lot of code
>> pieces. A few scenarios in which this is happening is if a class passes
>> its reference to child class for usage.
>>
>> I understand that the above might not be a fit datapoint for analysis
>> but wanted to understand if this is known or someone else has faced this?
>
> It happens when a module imports - directly or indirectly - another module
> which imports it - directly or indirectly - and they both have static
> constructors and/or static destructors (it _might_ not happen if one of them
> has static constructors but not static destructors and the other has static
> destructors and no static constructors, but if they both have either a static
> constructor or static destructor, it _will_ happen). This is because the
> compiler cannot determine which order to run the static
> constructors/destructors in. It doesn't know whether one depends on the other
> or whether the order matters, so it just doesn't accept it (though you usually
> get the error at runtime, not when it compiles; I'm not sure how or why you'd
> get it at compile time).
>
> Now, why you weren't seeing the problem with dmd 2.050 but are now with dmd
> 2.052, I don't know. The solution is generally to either make it so that one
> of the modules doesn't have any static constructors or destructors or to
> offload the initialization to another module (such as std.stdio does with
> std.stdiobase) by having the new module's static constructor call a function
> in the original module to do the initialization for that module. But if you do
> that, you then have the responsibility to make sure that there isn't an actual
> circular dependency in the static constructors themselves, or you're going to
> run into trouble.
>
> You can find discussions on how to solve the problem in the archives -
> probably on the D newsgroup.
>
> - Jonathan M Davis

Thanks, this worked for me. I shifted the code in the static constructor 
to another module and it works well now.

Regards
Mandeep


More information about the Digitalmars-d-learn mailing list