On Friday, 4 June 2021 at 15:19:17 UTC, bachmeier wrote:

It requires an R package if you want to call D functions from R. You need to link to R itself if you want to do something like pass a vector from R to D and then access that data from D. Since R is aware of the location of all the underlying libraries, it's easiest to let it generate the dub.sdl for you.

I guess you're using the older .C interface [as done here](http://users.stat.umn.edu/~geyer/rc/). Good enough if passing double* and int* pointers to D functions will suffice. Only thing you need to do to initialize the D runtime is add this to your D code

```
struct DllInfo;

extern(C) void R_init_libfoo(DllInfo * info) {
    Runtime.initialize();
}
```

where foo is the name of the library you're loading (foo.so).

I've just read the documentation and had a go, **compiling with GDC worked for both `.C` and `.Call`**.

I tried with all three compilers DMD, LDC, and GDC, and looked at the outputs with the nm tool. I don't think this matters much but DMD and LDC are more likely to list functions (DMD) or symbols in referenced modules (LDC) as weak symbols. I think the more likely the reason GDC worked is because it is a GNU compiler this has full GLIBC compatibility with reference to the `librt.so.1` `GLIBC_PRIVATE` error.

The R ext documentation you kindly referenced says:

*"By default, R uses the operating-system-specific dynamic loader to lookup the symbol in all loaded DLLs and the R executable or libraries it is linked to."*

and that:

*"Registering routines has two main advantages: it provides a faster way to find the address of the entry point via tables stored in the DLL at compilation time, and it provides a run-time check that the entry point is called with the right number of arguments and, optionally, the right argument types."*

So registering symbols is not the issue. The error was specific to GLIBC which is probably why the GNU compiler worked.

Thank you.

Reply via email to