Go未链接我的程序集:未定义的外部函数


82

我试图写一些SIMD主要用于学习目的。我知道Go可以链接程序集,但是我无法使其正常工作。

这是我可以做的最简单的示例(逐元素矢量乘法):

vec_amd64.s(注意:实际文件下面有一个空格行,RET因为否则会导致错误)

// func mul(v1, v2 Vec4) Vec4
TEXT .mul(SB),4,$0-48
    MOVUPS v1+0(FP),  X0
    MOVUPS v2+16(FP), X1
    MULPS  X1, X0
    // also tried ret+32 since I've seen some places do that
    MOVUPS X0, toReturn+32(FP)
    RET

vec.go

package simd

type Vec4 [4]float32

func (v1 Vec4) Mul(v2 Vec4) Vec4 {
    return Vec4{v1[0] * v2[0], v1[1] * v2[1], v1[2] * v2[2], v1[3] * v2[3]}
}

func mul(v1, v2 Vec4) Vec4

simd_test.go

package simd

import (
    "testing"
)

func TestMul(t *testing.T) {
    v1 := Vec4{1, 2, 3, 4}
    v2 := Vec4{5, 6, 7, 8}

    res := v1.Mul(v2)
    res2 := mul(v1, v2)

    // Placeholder until I get it to compile
    if res != res2 {
        t.Fatalf("Expected %v; got %v", res, res2)
    }
}

当我尝试运行时go test,出现错误:

# testmain
simd.TestMul: call to external function simd.mul
simd.TestMul: undefined: simd.mul

go env命令报告myGOHOSTARCH为,amd64而Go版本为1.3。为了确认这不是导致此问题的体系结构,我找到了另一个使用程序集的程序包,并删除了所有程序集文件,除了_amd64.s一个程序包及其测试运行良好。

我还尝试将其更改为导出的标识符,以防引起怪异但没有骰子。我想我非常密切地关注了像math/big这样的软件包中的模板,因此希望它是我所缺少的简单明了的东西。

我知道Go至少会尝试使用该程序集,因为如果我在.s文件中引入语法错误,则构建工具会抱怨它。

编辑:

要清楚,go build将干净地编译,但go test会导致错误出现。


go build干净地完成,go test失败。
LinearZoetrope 2014年

1
您如何编译?您没有回答问题。
2014年

1
您从相对于源文件的目录中输入了哪些命令?我使用go构建工具进行编译。很模糊。这可能意味着什么。
2014年

1
有调用之间的差异go buildgo build foo.go等,这也可能是可能的,你有你的时髦的设置$GOPATH等,你写的越多正是你做,就越容易帮助你。最好的办法是发布shell会话的成绩单而不是prosa。
2014年

12
Go语言似乎真的很喜欢中点字符。相关:函数名称和原型中的斜线和圆点?
科迪·格雷

Answers:


96

您使用了错误的点。代替

TEXT .mul(SB),4,$0-48

TEXT ·mul(SB),4,$0-48

一切都很好。


11
好吧,这很微妙,我没有注意到这是一个中间点。谢谢。
LinearZoetrope 2014年

13
人们如何在美国QWERTY键盘上输入该密码?还是这不是一个常见的用例,您可以根据需要在其中搜索该符号?
Seiyria 2014年

9
这样。不吸吮(即不是Windows)的OS会映射QWERTY布局的未使用层,以便可以输入字符如interpunct。
2014年

7
@FUZxxl FYI Alt-0183(使用数字键盘)仍适用于Windows。效果不佳,通常在笔记本电脑上很难,但可以。
Intermernet 2014年

4
在Linux(至少是Ubuntu)上,如果您启用了compose键<compose> ^ .=·
Izkata 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.