Golang高性能正则库 - Hyperscan的gohs使用指南

Golang高性能正则库 - Hyperscan的gohs使用指南 我正在我的仓库中使用 gohs 库,并希望在 Windows 上构建它。 为此应该遵循什么流程? 我看到了一个关于如何在 Windows 上编译原始 Hyperscan 仓库的分步指南,但结果是生成一个 .exe 文件,我认为在这种情况下这是不必要的。 当我尝试使用 Windows 标签构建我的代码时,我从 gohs 库中得到了编译错误。 感谢您的帮助!


更多关于Golang高性能正则库 - Hyperscan的gohs使用指南的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

这似乎是关于 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)
	}
}

注意事项

  1. 确保使用64位工具链(MinGW-w64或VS2019+)
  2. 如果使用MinGW,添加-static-libgcc -static-libstdc++链接选项
  3. 对于复杂正则表达式,可能需要增加栈大小:
//go:build windows
// +build windows

/*
#cgo windows LDFLAGS: -Wl,--stack,16777216
*/
import "C"

按照以上步骤操作,应该能解决Windows上的编译问题。主要难点在于正确链接Hyperscan的静态库及其依赖项。

回到顶部