Blog de programación, errores, soluciones

Chose Language:
Author: Admin/Publisher |finished | checked

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 funcionando
package main

/*
#include 
*/
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.

Category: go
Something wrong? If you found an error or mistake in the content you can contact me on Twitter | @luisg2249_luis.
Last 4 post in same category