Package module not working properly

Dejan Lekic dejan.lekic at gmail.com
Wed Aug 14 08:35:35 PDT 2013


On Wednesday, 14 August 2013 at 14:43:47 UTC, Jacob Carlborg 
wrote:
> I'm trying to the get the "package modules" working in the new 
> package std.serialization I'm working on. I have a sample file 
> I'm compiling, looking like this:
>
> import std.serialization;
> import std.serialization.archives;
>
> class Foo
> {
>     int a;
> }
>
> void main ()
> {
>     auto archive = new XmlArchive!();
>     auto serializer = new Serializer(archive);
>
>     auto foo = new Foo;
>     foo.a = 3;
>
>     serializer.serialize(foo);
>     auto foo2 = 
> serializer.deserialize!(Foo)(archive.untypedData);
>
>     assert(foo2.a == 3);
>     assert(foo.a == foo2.a);
> }
>
> When I compile it I get these linker errors:
>
> Undefined symbols for architecture x86_64:
>   "_D3std13serialization12__ModuleInfoZ", referenced from:
>       _D4main12__ModuleInfoZ in main.o
>   "_D3std13serialization8archives12__ModuleInfoZ", referenced 
> from:
>       _D4main12__ModuleInfoZ in main.o
> ld: symbol(s) not found for architecture x86_64
> collect2: ld returned 1 exit status
> --- errorlevel 1
>
> If I instead only import the exact modules that are needed, 
> like this:
>
> import std.serialization.serializer;
> import std.serialization.archives.xmlarchive;
>
> Everything works as expected.
>
> I have a module declaration in std/serialization/package.d, 
> like this:
>
> module std.serialization;
>
> And in std/serialization/archives/package.d
>
> module std.archives;
>
> First, I don't know if I should have any module declarations at 
> all in these "package modules". Or if they should be like above 
> or something like "module std.archives.package;".
>
> If I remove the module declarations in the package modules I 
> get this assertion in the compiler:
>
> Assertion failed: (p->isPkgMod == PKGmodule), function load, 
> file import.c, line 136.
> Abort trap:
>
> I don't know if I'm doing something wrong of if this new 
> feature isn't working properly.
>
> The code is available there: 
> https://github.com/jacob-carlborg/phobos/tree/serialization

Looks to me like you are trying to import the package. It never 
worked. That is why over the time two groups of D developers 
emerged. Those who use the /path/to/package/all.d and those who 
use /path/to/package/_.d ... I belong to the first group, and 
would expect something like: import std.serialization.all; or 
import std.serialization._;
Some guys rightfully argued about not being able to be more 
selective, but so far I think the approach above works perfectly.


More information about the Digitalmars-d mailing list