Go не связывает мою сборку: неопределенная внешняя функция
Я пытаюсь написать некоторые SIMD в основном для учебных целей. Я знаю, что Go может связать сборку, но я не могу заставить ее работать правильно.
вот самый минимальный пример, который я могу сделать (поэлементное векторное умножение):
vec_amd64.s (Примечание: фактический файл имеет пробел под RET
так как это приводит к ошибкам иначе)
// func mul(v1, v2 Vec4) Vec4
TEXT .mul(SB),4,-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.иди
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.иди
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
The go env
команда сообщает my GOHOSTARCH
на amd64
и моя версия Go будет 1.3. Чтобы подтвердить, что это не была архитектура, вызывающая проблему, я нашел другой пакет, который использует сборку и удалил все файлы сборки, кроме _amd64.s
один и его тесты побежали штраф.
Я также попытался изменить его на экспортированный идентификатор в случае, если это вызывало странности, но не кости. Я думаю, что я довольно внимательно следил за шаблоном в пакетах, таких как math/big
, так что надеюсь, это что-то простое и очевидное, что я упускаю.
Я знаю, что идти по крайней мере попытка чтобы использовать сборку, потому что если я введу синтаксическую ошибку.s файл инструмент сборки будет жаловаться на это.
Edit:
будет чисто,go build
будет компилироваться чисто, но go test
вызывает появление ошибки.