es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Intentando permitir a cgo construir tanto en Linux como en Windows, obtengo “las restricciones de construcción excluyen todos los archivos Go”.

Estoy trabajando en una pequeña aplicación de Go que utiliza Cgo. Estoy trabajando en una máquina virtual de Linux, y Linux es el entorno principal de destino. Sin embargo, tengo la necesidad de crear un ejecutable de Windows. Normalmente, la compilación cruzada de Go es trivial, pero Cgo agrega algunas complicaciones. He notado al menos dos problemas, pero solo preguntaré sobre el primer problema aquí.

Mi aplicación solo tiene un archivo fuente que requiere Cgo, y la única diferencia entre la compilación de Windows y Linux es la ruta de la librería.

Esto es lo que tengo hasta ahora para el comienzo del encabezado de Cgo. Después de esto hay algunas referencias a archivos de inclusión:

/* 
#cgo CFLAGS: -g -Wall -I${SRCDIR}/../include/v6.21.0 
#cgo linux LDFLAGS: -L${SRCDIR}/../lib/linux/v6.21.0 -lvibesimple -lcurl -lssl -lvibecrypto -lvibeictk -lvibeserver 
#cgo windows LDFLAGS: -L${SRCDIR}/../lib/windows/v6.21.0 -lvibesimple -lcurl -lssl -lvibecrypto -lvibeictk -lvibeserver 
*/

Cuando compilo esto en Linux, o con GOOS=linux, funciona bien.

Cuando compilo esto para Windows, obtengo esto:

$ GOOS=windows go build -o target/dist/windows-amd64
package voltagems
    imports voltagems/app
    imports voltagems/handlers
    imports voltagems/voltagefuncs: build constraints exclude all Go files in /home/<uid>/git/voltagego/voltagefuncs

Sé que puedo crear archivos que terminen en “linux.go” o “windows.go”, pero eso sería doloroso. Eso significaría duplicar todo el archivo fuente y tener que mantener ambas copias.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Como experto en IT especializado en Go y Cgo, sugiero utilizar restricciones de compilación para solucionar el problema de la compilación cruzada con Cgo. Las restricciones de compilación pueden especificar etiquetas de compilación que se usan para construir archivos específicos para diferentes sistemas operativos.

    En este caso, puede crear un nuevo archivo llamado “cgo_windows.go”, que contenga la cabecera de Cgo y haga referencia a las bibliotecas específicas de Windows. Luego, en su archivo de origen principal, puede usar restricciones de compilación para especificar qué archivos importar según el sistema operativo actual. Por ejemplo:

    // main.go
    package main
    
    // +build ! windows
    import "voltagems/voltagefuncs"
    
    // +build windows
    import "voltagems/voltagefuncs_windows"
    
    func main() {
        // su lógica principal
    }
    

    De esta manera, cuando construya para Linux, el paquete “voltagefuncs” se importará desde el archivo de origen original y cuando construya para Windows, se importará desde el archivo “voltagefuncs_windows” que contiene la cabecera Cgo y las referencias a bibliotecas específicas de Windows.

    Este enfoque evita duplicar todo el archivo fuente y solo requiere crear archivos separados para la cabecera Cgo y las referencias a bibliotecas. También permite mantener una sola base de código sin desorden relacionado con la compilación.

Comments are closed.