Golang高性能正则库 - Hyperscan的gohs使用指南
Golang高性能正则库 - Hyperscan的gohs使用指南
我正在我的仓库中使用 gohs 库,并希望在 Windows 上构建它。
为此应该遵循什么流程?
我看到了一个关于如何在 Windows 上编译原始 Hyperscan 仓库的分步指南,但结果是生成一个 .exe 文件,我认为在这种情况下这是不必要的。
当我尝试使用 Windows 标签构建我的代码时,我从 gohs 库中得到了编译错误。
感谢您的帮助!
更多关于Golang高性能正则库 - Hyperscan的gohs使用指南的实战教程也可以访问 https://www.itying.com/category-94-b0.html
这似乎是关于 gohs 和/或 hyperscan 仓库的问题?
更多关于Golang高性能正则库 - Hyperscan的gohs使用指南的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Windows上构建gohs需要先编译Hyperscan的C库,然后通过cgo链接。以下是具体步骤:
1. 编译Hyperscan静态库
首先按照Intel指南编译Hyperscan,但需要生成静态库而非可执行文件。在CMake配置中添加:
cmake -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release ..
编译后会得到hs.lib(Windows静态库)。
2. 设置CGO环境
在Go项目中创建build_windows.go文件:
//go:build windows
// +build windows
package gohs
/*
#cgo windows LDFLAGS: -L${SRCDIR}/lib -lhs -lstdc++
#cgo windows CFLAGS: -I${SRCDIR}/include
*/
import "C"
将编译好的hs.lib放入lib/目录,头文件放入include/目录。
3. 解决常见编译错误
如果遇到链接错误,检查库依赖。Hyperscan需要以下额外库:
//go:build windows
// +build windows
package gohs
/*
#cgo windows LDFLAGS: -L${SRCDIR}/lib -lhs -lpcre -lsqlite3 -lstdc++ -luser32 -ladvapi32
#cgo windows CFLAGS: -I${SRCDIR}/include -DHYPERSCAN_STATIC
*/
import "C"
4. 完整构建示例
创建build.ps1 PowerShell脚本:
# 1. 编译Hyperscan
mkdir build
cd build
cmake -G "Visual Studio 16 2019" -A x64 -DBUILD_SHARED_LIBS=OFF ..
cmake --build . --config Release
# 2. 复制库文件
cp lib/Release/hs.lib ../vendor/hyperscan/lib/
cp src/*.h ../vendor/hyperscan/include/
# 3. 构建Go项目
cd ..
go build -tags static
5. 使用示例
成功构建后,正常使用gohs:
package main
import (
"fmt"
"github.com/flier/gohs/hyperscan"
)
func main() {
pattern := `test\d+`
db, err := hyperscan.NewBlockDatabase(pattern)
if err != nil {
panic(err)
}
defer db.Close()
scratch, _ := hyperscan.NewScratch(db)
defer scratch.Free()
handler := func(id uint, from, to uint64, flags uint, context interface{}) error {
fmt.Printf("匹配到模式 %d: %d-%d\n", id, from, to)
return nil
}
err = db.Scan([]byte("test123 test456"), scratch, handler, nil)
if err != nil {
panic(err)
}
}
注意事项
- 确保使用64位工具链(MinGW-w64或VS2019+)
- 如果使用MinGW,添加
-static-libgcc -static-libstdc++链接选项 - 对于复杂正则表达式,可能需要增加栈大小:
//go:build windows
// +build windows
/*
#cgo windows LDFLAGS: -Wl,--stack,16777216
*/
import "C"
按照以上步骤操作,应该能解决Windows上的编译问题。主要难点在于正确链接Hyperscan的静态库及其依赖项。

