On Thursday, 25 February 2016 at 21:06:59 UTC, mahdi wrote:
On Thursday, 25 February 2016 at 16:45:46 UTC, Chris Wright

Thanks. Is there a way to use a D library without having access to it's source code? I tried `dmd -lib abcd.d` which creates a static library. But still I need to specify path to library's source files using -I option when compiling the code that uses that library.

So if we have just access to the library file, is it possible to use it in the code?

The compiler needs to know what symbols are available from any imports you use in your source. .di files exist to allow closed source projects to be distributed as binary. They are analagous to C or C++ header files. You could create them by hand like so:

// foo.d
struct S { int x, y; }
void addTwo(S s) { s.x += 2; s.y += 2; }

// foo.di
struct S { int x, y; }
void addTwo(S s);

The compiler needs to know about S and its types, and it needs to know the signature of addTwo. The .di file allows you to provide that while keeping the implementation of addTwo closed. When foo is imported in client code, the compiler will find foo.di and use that instead of foo.d.

However, the compiler must have the source for templates, as they are instantiated when they are used, not when the library is compiled. The same is true for any functions you want inlined. In the example above, addTwo can only be inlined when foo.d is used, since the compiler will not have the implementation with foo.di.

Reply via email to