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

我试图写一些SIMD主要用于学习的目的。 我知道去可以链接程序集,但我不能让它正常工作。

这是我能做的最简单的例子(元素向量乘法):

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命令报告我的GOHOSTARCHamd64 ,我的Go版本是1.3。 为了确认它不是导致这个问题的体系结构,我发现了另一个使用程序集的程序包,并删除了_amd64.s之外的所有程序集文件,其testing运行良好。

我也试过把它改成一个导出的标识符,以防造成怪异,但没有骰子。 我想我很喜欢math/big包装中的模板,所以希望这是简单明了的,我错过了。

我知道Go至less试图使用程序集,因为如果我向.s文件引入语法错误,构build工具将会抱怨它。

编辑:

清楚的是,编译会干净地编译,但是go test会导致错误出现。

你正在使用错误的点。 代替

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

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

一切正常。