Dlang错误42:符号未定义

时间:2016-05-27 18:35:42

标签: d

我最近开始学习D,还有模板。我想做一个小例子来强化阅读,但后来我得到了这个错误。

特别是对于我的代码,它说:

using_point.obj(using_point)
Error 42: Symbol Undefined _D6points7_arrayZ --- errorlevel1

这是我的代码:

module point;

class Point(Type: long) {

     public string name;
     public Type[] locations;

     alias Type T;

     this(string name, Type[] magnitudes) {
         this.name = name;

         for(int i = 0; i < magnitudes.length; i++)
              locations ~= magnitudes[i];
     }  

     override
     public string toString() {
         string output = this.name ~ " = (" ~ this.locations[0];

         for(int i = 1; i < locations.length; i++)
             output ~= "," ~ this.locations[i];

         output ~= ")";

         return output;     
     }
}

和主要:

module using_point;
import std.stdio;
import point;


void main() {
    byte[] mags = [1,2,3];
    auto p1 = new Point!byte("P", mags);
}

我知道这是一个链接错误,但由于我没有使用外部库,我认为我已经正确定义了Point的构造函数,我似乎无法找到问题。

1 个答案:

答案 0 :(得分:1)

从评论中,您似乎正在运行以下内容:

dmd -c point.d
dmd main.d # presumably contains `import point;`

第一个命令将point.d编译(但不链接)到point.o

第二个命令编译并将main.dmain.d 链接到可执行文件中。它失败了一个&#34;缺少符号&#34;错误,因为DMD不会查找或生成不在其命令行上的任何内容的代码。当您import points;时,您只导入符号,而不是实际代码。

要解决这个问题,要么......

  1. points.d一起编译main.d

    dmd main.d points.d
    
  2. points.o的链接:

    dmd -c points.d
    dmd main.d points.o
    
  3. 或者使用rdmd,它将扫描您的所有导入,找出需要编译的内容,编译程序并运行它:

    rdmd main.d