【问题标题】:Linker Error; Cannot Link: _D16TypeInfo_HAyayAa6__initZ链接器错误;无法链接:_D16TypeInfo_HayayAa6__initZ
【发布时间】:2013-11-23 21:31:55
【问题描述】:

链接我的代码时,我收到以下错误:

../Build/main.o:(.data._D16TypeInfo_yHAyaAa6__initZ+0x10):未定义对`_D16TypeInfo_HAyayaAa6__initZ'的引用

我不知道错误发生在哪里,所以我可以提供给您的代码不多。有很多代码。

【问题讨论】:

  • 什么是编译器,什么是环境?
  • @DejanLekic Linux 64 位
  • _D16TypeInfo_HAyayaAa6__initZ 不能被拆解,所以没有代码几乎不可能猜出发生了什么。将其粘贴到 DPaste 上,并给我们链接...
  • 如果将来有人需要知道如何破解这些东西,模式相当简单:每个字母都与一个基本类型或修饰符相关。修饰符是第一位的。 H 是关联数组。然后是关键:A 是数组,y 是不可变的,a 是 char。所以 Aya == 不可变字符数组,又名 immutable(char)[],又名字符串。然后 aa 的值:yAa:不可变 char 数组,又名 immutable(char[])。如果您需要查找字母的含义,可以在 dlang.org abi 页面上查找。
  • 差不多,但不完全是:它是immutable(char[])[immutable(char)[]]。你错过了一个'A',这意味着数组,我认为你在键之前读取了值。键然后值损坏。一个更简单的例子是 Hai。 H 表示 assoc 数组,接下来的两种类型是 key 然后 value,a 表示 char,i 表示 int。所以Hai == int[char]。然后,在读取修饰符字符时,如果您看到一个,它适用于所有其余字符,直到基本类型。所以 Aya,'a' 是基本类型,所以这就是它的结尾。然后阅读其余部分:不可变字符数组:不可变(字符)[]。 yAa 也使整个数组不可变。

标签: linker d


【解决方案1】:

尝试使用 main() 将此代码添加到您的文件中:

void aaHack() {
    import std.stdio;
    writeln(typeid(immutable(char[])[string]));
}

然后重新编译,看看它是否有效。我确定您的错误是由关联数组中的一个旧错误引起的,该错误非常难以重现;它似乎来来往往是随机的,也很难修复。所需的确切类型是我不确定的东西,我根据眼球脱色猜测那里,但我认为就是这样。

无论如何,现在 D 中的关联数组实现卡在两个想法之间的中间点:通过特殊运行时调用在语言中实现,以及在库中实现,除了语法糖之外没有编译器支持。再说一次,我不确定确定这就是原因,但它是围绕着这些变化而来的,所以我认为就是这样。我相信正在发生的是你引用了 AA 类型,然后通过半完成库类型使用它,但是这些函数需要 typeinfo 用于编译器的魔术调用,并且它永远不会被正确插入。什么的。

但破解的解决方法是在某处手动强制提及 typeid 以弥合差距。我的 cgi.d 有一个 14 行的块,一遍又一遍地解决这个问题:完全不可变的键和/或值似乎是打破它的边缘情况,而尾部不可变数组(例如字符串)工作正常。也许编译器会假设其他东西会被剥离,但事实并非如此,idk,但这个 hack 对我来说效果很好。

【讨论】:

  • 我实际上并没有使用任何奇怪的关联数组,只是 immutable string[string] 但它仍然有效。谢谢!
猜你喜欢
  • 2018-06-22
  • 2016-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-04
  • 2011-03-16
相关资源
最近更新 更多