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:
#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:
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:
#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?