dmd -unittest -main -run: undefined reference to `_D1c12__ModuleInfoZ'
ag0aep6g
anonymous at example.com
Thu May 2 13:25:56 UTC 2019
On 02.05.19 01:18, kdevel wrote:
> Now I have:
>
> a/main.d
> a/b/package.d
> a/b/c/package.d
>
> b/package.d and c/package.d as before.
For reference, a/b/c/package.d is this:
module c; package import std.file;
And a/b/package.d starts with:
module b; import c;
> a/main.d is
>
> ```
> import b;
>
> void dummy ()
> {
> string s = "test";
> mkdir (s);
> }
> ```
>
> In cwd a/ with
>
> $ dmd -unittest -main -i -run main.d
>
> I get
>
> b/package.d(2): Error: module `c` is in file 'c.d' which cannot be read
> import path[0] = /.../dmd2/linux/bin64/../../src/phobos
> import path[1] = /.../dmd2/linux/bin64/../../src/druntime/import
>
> Why does dmd not get it?
If you want c to be part of the package b, you have to state that in the
module declaration and when importing it.
In c/package.d:
module b.c;
In b/package.d:
import b.c;
Module declarations and imports are always absolute. They're not
relative to the current package. If you add a new root directory on top,
you have to adjust those declarations in all files.
> I have to supply -I=b explicitly. Which leads
> me to
> the actual problem I wanted to post:
>
> $ dmd -unittest -main -I=b -run main.d
> main.d(6): Error: undefined identifier mkdir
main only imports b. And b doesn't expose mkdir.
You can either import c (or rather b.c) in main, or make b's import of c
public.
By the way, `package import` seems to work just like `public import`,
not restricting anything. Looks like a compiler bug.
> The problem I see here is that b passes the isolated unittest. But when
> it is used undefined symbols show up. I stumbled over this problem while
> using a project as submodule which uses msgpack-d as its submodule. Only
> if I restrict
> the import like in
>
> import msgpack : unpack, pack;
>
> my submodule's unittest fails right away. My submodule corresponds to
> b/package.d in this thread. I suppose the line
>
> package import std.file, core.stdc.string;
>
> in msgpack-d's file packer.d causes the export of mkdir. Right?
"Export" in the sense of D identifier visibility, yes.
Note that an "undefined identifier" error is different from one about an
"undefined reference". The former is the compiler saying it can't find
the definition of a D identifier. The latter is the linker saying it
can't find a symbol in the object files.
More information about the Digitalmars-d-learn
mailing list