Using C header libs with importC

Renato renato at athaydes.com
Mon Jan 8 21:28:17 UTC 2024


On Monday, 8 January 2024 at 19:17:06 UTC, Lance Bachmeier wrote:
> On Monday, 8 January 2024 at 18:53:47 UTC, Renato wrote:
>> Is it possible to use C header-only libs from D?
>>
>> In C, I would need to do this:
>>
>> ```c
>> #define STB_DS_IMPLEMENTATION
>> #include "stb_ds.h"
>> ```
>>
>> The definition must be done in a single C file before 
>> including the h file.
>>
>> I tried this in D:
>>
>> ```d
>> enum STB_DS_IMPLEMENTATION = 1;
>> import stb_ds;
>> ```
>>
>> But it doesn't work. Any suggestions? Perhaps using an 
>> intermediate C file to do this would work, but I wanted to 
>> know if D can do it.
>
> Without knowing the specifics of what you're trying to do, this 
> automatic translation of C headers to D might be what you want:

I am trying to use a header-only C library. A h file from this 
project, specifically: https://github.com/nothings/stb

> https://forum.dlang.org/post/ugvc3o$5t3$1@digitalmars.com
>
> The way "header-only" is usually used suggests you should 
> change the file extension to .c and compile it directly.

That doesn't work without the `#define`, as I mentioned. Header 
libraries like this are designed to only be included once, given 
that they have impl code, so they rely on the C file defining a 
variable to explicitly "enable" the impl code to be included.

Based on that thread you've linked, I tried generating a di file 
from a basic C file that just has the define and include:

```c
#define STB_DS_IMPLEMENTATION
#include "stb_ds.h"
```

But that gets me a seg fault with DMD:

```
▶ dmd -c import_stb_ds.c -Hf=stb_ds.di
[1]    73719 segmentation fault  dmd -c import_stb_ds.c 
-Hf=stb_ds.di
(dmd-2.106.1)
```

LDC also does:

```
▶ ldc2 -c import_stb_ds.c -Hf=stb_ds.di
Stack dump without symbol names (ensure you have llvm-symbolizer 
in your PATH or set the environment var `LLVM_SYMBOLIZER_PATH` to 
point to it):
0  ldc2                     0x000000010f860d87 
llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) + 39
1  ldc2                     0x000000010f85fce6 
llvm::sys::RunSignalHandlers() + 198
2  ldc2                     0x000000010f8613e0 SignalHandler(int) 
+ 288
3  libsystem_platform.dylib 0x00007ff8115bf37d _sigtramp + 29
4  libsystem_c.dylib        0x00007ff81143772b __sfvwrite + 355
[1]    73787 segmentation fault  ldc2 -c import_stb_ds.c 
-Hf=stb_ds.di
(ldc-1.35.0)
```

Should I report a bug?


More information about the Digitalmars-d-learn mailing list