Can I create static c callable library?

Atila Neves atila.neves at gmail.com
Thu Sep 27 12:16:13 UTC 2018


On Tuesday, 25 September 2018 at 14:13:50 UTC, Jacob Carlborg 
wrote:
> On Tuesday, 25 September 2018 at 12:05:21 UTC, Jonathan M Davis 
> wrote:
>
>> If you use -betterC, then it's trivial, because your D program 
>> is restricted to extern(C) functions and features which don't 
>> require druntime. It can also be done without -betterC (and 
>> thus with druntime), but it gets to be _way_ more of a pain, 
>> because it requires that you manually initialize druntime - 
>> either by forcing whatever is using your "C" library to call a 
>> specific function to initialize druntime before using any of 
>> its normal functions or by having every function in the 
>> library check whether druntime has been initialized yet and 
>> initialize it if it hasn't been before it does whatever it's 
>> supposed to do.
>
> Shouldn't it be possible to use a C initialization function, 
> i.e. pragma(crt_constructor) to initialize druntime? Then it 
> only needs to be initialized once and it's not required to 
> check if it's initialized all the time.
>
> --
> /Jacob Carlborg

Even easier, compile this C file and add the resulting object 
file to your (now mostly) D static library:

-----------------------
extern int rt_init(void);
extern int rt_term(void);

__attribute__((__constructor__)) void dinit(void) {
     rt_init();
}
__attribute__((__destructor__)) void dterm(void) {
     rt_term();
}
-----------------------

The C runtime will initialise the D runtime for you.



More information about the Digitalmars-d-learn mailing list