Go에 내장된 regexp 모듈은 느리다... (엄청) 그래서 벤치마크 후 rure-go로 변경하였는데 리눅스에서는 쉬웠지만 윈도우에는 넘어야 할 관문이 많았다.
윈도우 개발 환경은 아무도 배려해주지 않는다.
문서는 리눅스 용으로 작성되어 있다.
cgo로 컴파일하려면 윈도우에는 없는 gcc가 필요하다.
윈도우에서는 go 파일에 import "C"가 있어도 CGO_ENABLED를 자동으로 켜주지 않는 것 같다.
\internal\*\*.go:22:16: undefined: rure.MustCompile
먼저 함수를 찾지 못했다는 오류가 발생한다. 가져온 rure.go 파일의 최상단에 import "C"를 처리해서 발생하지 못하는 문제다. CGO_ENABLED를 설정하여 cgo를 사용할 수 있다.
go env -w CGO_ENABLED=1
이제 gcc not found와 같은 메시지가 나온다. 윈도우에 gcc를 깔아야 한다. MinGW도 종류가 아주 많은데 LLVM-MinGW로 설치했다. 왜냐하면 지금은 LLVM의 시대니까.
파일이 아주 많은데 msvcrt는 구식, ucrt는 윈10 이후 신식이고, 64비트 윈도우 환경이므로 ...-ucrt-x86_64로 받으면 된다. 다른건 궁금하면 각자 검색해보자.
적당한 위치에 옮기고 환경 변수의 Path에 (해당 경로)/bin을 추가한다.
Rust 기본 설정으로 컴파일하고 링크하면 아래와 같이 오류가 발생한다. (clang 기준)
ld.lld: error: undefined symbol: const type_info::`vftable'
ld.lld: error: undefined symbol: __chkstk
윈도우에 Rust를 설치하면 기본적으로 MSVC를 사용한다. 이건 윈도우 꺼다. 이걸로 컴파일하면 우리의 gcc는 받아주지 않는다. Rust가 gcc를 위해 빌드할 수 있도록 타겟을 변경해야 한다.
rustup show # msvc 일거임
rustup target add x86_64-pc-windows-gnu
rustup default stable-x86_64-pc-windows-gnu
rustup show # 이제 gnu 일거임~
rure-go 리드미에 나와있는 대로 빌드해준다. 이번에는 .a 파일이 생성된다. 그럼 된거다.
go가 참조할 수 있도록 설정해 준다.
go env -w CGO_LDFLAGS="-L(경로)/regex/target/release"
해당 경로를 환경 변수에 추가해두긴 했는데 실험해보기엔 귀찮아서 만약 끝까지 따라해도 안되면 추가해보자.
윈도우에서는 프로세스가 시작되면 외부의 환경 변수를 다시 읽어올 수 없고, 변경해도 프로세스 내부에서만 저장되어서 환경 변수를 변경했다면 프로그램을 다시 시작해야 한다. 안해도 잘 되면 굳이 안 해도 된다.
배포는 어차피 리눅스로 할건데 괜히 고생했다. 그래도 이제 개발할 때 편하다.
그럴 일은 없겠지만 이 글이 미래의 나를 제외한 누군가에게 도움이 되면 좋겠다.
ChatGPT