Integrando bibliotecas de C en el lenguaje Go sobre Windows
Hoy veremos como podemos integrar bibliotecas de C en el lenguaje GO cuando estamos utilizando el sistema operativo de Windows.
Muchos paquetes de Go utilizan bibliotecas de C, por esa razón algunas veces obtendrás errores de no tener CGO
Pero que es Cgo?
Cgo enables the creation of Go packages that call C code.
https://pkg.go.dev/cmd/cgo
Esta es una biblioteca estándar que permite la creación de paquetes GO que llamen código C
ERROR # runtime/cgo cgo: C compiler "gcc" not found: exec: "gcc": executable file not found in %PATH% exit status 1
Para poder usar paquetes de C en Go deberás de tener un compilador de C instalado,.En mi caso instale Cygwing, pero no funciono correctamente y MSyS2 tampoco terminando por usar TDM-GCC-64 el cual puedes bajarlo de https://jmeubank.github.io/tdm-gcc/
https://jmeubank.github.io/tdm-gcc/
Una vez lo bajes y le des a instalar, puedes darle directamente al botón CREATE
Termina la instalación y con esto debería ser suficiente.
Luego deberás de abrir la consola perteneciente a TDM-GCC, debería aparecer en el inicio de Windows, en caso de que no busca en la barra inferior de tu Windows las palabras MinGW, el nombre que tendrá es MinGW command prompt
Abre esta nueva consola, y chequea si GOROOT esta correcta GOPATH está correcta y CGO_ENABLED posee el valor 1
puedes ver más información sobre estos valores aquí: https://blastcoding.com/en/frequently-used-predefined-environment-variables-in-go/
Desde la consola intenta correr el siguiente programa para ver si puedes utilizar C
Puedes crearte un main con el siguiente codigo para probar si Cgo esta funcionandopackage main /* #include[ADS_A1/]*/ import "C" import "fmt" func main() { fmt.Println("Hello from Go") C.puts(C.CString("Hello from C")) // Wait for user input before exiting var input string fmt.Println("Press Enter to exit...") fmt.Scanln(&input) }
Problemas con Antivirus
Al correr este programa puedes tener el problema de Access denied esto puede ser por tu Antivirus, si pasa esto chequea el Hault o cuarentena(Quarantine) por las dudas, no todos los antivirus reaccionarán ante la creación de un programa en Go
Como puedes ver en mi antivirus cuando corro go run main go crea el .exe que el antivirus interpreta como un archivo que puede ser peligroso para mi PC aunque este no lo es, esto es debido a que el main es autogenerado por Go.
También podemos ver wailsbindings.exe, este archivo es creado por Wails una GUI para Go en ese caso nos dará un problema.
wails build Wails CLI v2.8.2 # Build Options Platform(s) | windows/amd64 Compiler | C:\Program Files\Go\bin\go.exe Skip Bindings | false Build Mode | production Devtools | false Frontend Directory | C:\Users\luisg\go\src\XXXXXX\frontend Obfuscated | false Skip Frontend | false Compress | false Package | true Clean Bin Dir | false LDFlags | Tags | [] Race Detector | false # Building target: windows/amd64 • Generating bindings: ERROR fork/exec C:\Users\luisg\AppData\Local\Temp\wailsbindings.exe: Access is denied. ERROR fork/exec C:\Users\luisg\AppData\Local\Temp\wailsbindings.exe: Access is denied.
Pero que pasa en realidad lo que pasa es que el Antivirus pasa este archivo a la cuarentena y, por tanto, cuando hacemos wails dev
o wails build
el archivo no será encontrado.
Puedes restablecer este archivo, si lo deseas, este pasará el archivo a estar excluido en la búsqueda de virus en tiempo real.
También en tu antivirus puedes evitar que cheque carpetas enteras en tiempo real si lo deseas
lamentablemente, cuando hacemos un go build main crea un archivo main.exe en una carpeta diferente dentro de Temp de todos modos podríamos excluir a Temp del escaneo en tiempo real.