Linker error regarding importing and unit tests. Is this a bug?
Daniel Davidson
nospam at spam.com
Fri Nov 1 08:32:53 PDT 2013
On Friday, 1 November 2013 at 12:59:24 UTC, Gary Willoughby wrote:
> I have a small test case that displays a linker error. I
> wondered if this is an issue with the tool chain or whether i'm
> doing something wrong.
>
> I have a simple directory structure like this:
>
> test/methods.d
> test/test1.d
> test/test2.d
>
> Here is the source code for the above modules:
>
> methods.d:
>
> module test.methods;
>
> import std.array;
>
> public bool nothing(int[] x)
> {
> return x.empty();
> }
>
> test1.d:
>
> module test.test1;
>
> struct S
> {
> int x[];
> }
>
> unittest
> {
> import test.methods;
> import std.stdio;
>
> writeln("test1 unit test");
>
> S s;
>
> assert(s.x.nothing());
> }
>
> test2.d:
>
> module test.test2;
>
> import test.test1;
>
> struct T
> {
> int x[];
> }
>
> I compile the following sources like this:
>
> rdmd --force -de -debug -I~/Desktop -m64 -main -property
> -unittest -w <file>
>
> Where <file> is an individual file above. I do this because i
> like to compile and tests each module in isolation running the
> unit tests. When i try and compile `test2.d` i get the
> following error:
>
> Undefined symbols for architecture x86_64:
> "_D4test7methods12__ModuleInfoZ", referenced from:
> _D4test5test112__ModuleInfoZ in test2.o
> "_D4test7methods7nothingFAiZb", referenced from:
> _D4test5test114__unittestL8_1FZv in test2.o
> ld: symbol(s) not found for architecture x86_64
> clang: error: linker command failed with exit code 1 (use -v to
> see invocation)
>
> If i add the following to the bottom of `test2.d` it all
> compiles fine:
>
> unittest
> {
> import test.methods;
> }
>
> Any idea what's going on here?
An alternative is to move the import statements in test1.d out of
the unittest block, which becomes a function, to file scope. Then
if you have multiple unittests in test1.d all are covered and the
symbols are available.
...
version(unittest) {
import methods;
}
unittest
{
import std.stdio;
writeln("test1 unit test");
S s;
assert(s.x.nothing());
}
Thanks
Dan
More information about the Digitalmars-d-learn
mailing list