Uso del código Go en un proyecto C existente

4 minutos de lectura

Uso del codigo Go en un proyecto C
terrorifico

Desde que salió Go 1.5, comencé a analizar de nuevo cómo podría integrarlo en un proyecto mío existente.

El código base del proyecto está escrito completamente en C para acceso de bajo nivel al hardware y otras cosas divertidas. Sin embargo, algunas de las cosas de nivel superior son tediosas y me gustaría comenzar a escribirlas en un lenguaje de nivel superior (Ir)

¿Hay alguna forma de llamar al código Go desde un programa en C? Instalé Go 1.5, que agregó -buildmode=c-archive (https://golang.org/s/execmodes) que estoy tratando de hacer funcionar.

Sin embargo, parece que no puedo hacer que Go genere los archivos de encabezado apropiados para permitir que mi proyecto realmente se compile. Cuando genero el archivo, veo la función en los símbolos exportados (usando objdump), pero sin los archivos de encabezado para incluir gcc se queja de que la función no existe (como se esperaba)

Soy bastante nuevo en Go; sin embargo, me encanta el idioma y me gustaría usarlo. ¿Hay alguna manera idiomática (“idiomática” se usa mucho en el mundo de Go I see…) para hacer que esto funcione bien con los demás?

La razón por la que hice esta pregunta y mencioné específicamente Go 1.5 es que, según este documento, https://docs.google.com/document/d/1nr-TQHw_er6GOQRsF6T43GGhFDelrAP0NqSS_00RgZQ/edit?pli=1#heading=h.1gw5ytjfcoque
Go 1.5 agregó soporte para programas que no son de Go para llamar al código de Go. Específicamente, mencionado en la sección “Código de Go vinculado y llamado desde un programa que no es de Go”

  • ¿Estás exportando a través de cgo? El documento al que vincula dice: “Los únicos símbolos invocables serán los marcados como exportados (por cualquier paquete), como se describe en el documentación cgo.” Ese enlace a la documentación cgo menciona un generado _cgo_export.h.

    – Dave C.

    25 de agosto de 2015 a las 23:53

  • Una pregunta anterior decía que la respuesta es no. Sería curioso si algo ha cambiado en 1.5, pero lo dudo: stackoverflow.com/questions/6125683/call-go-functions-from-c

    – Gabriel Sur

    25 de agosto de 2015 a las 23:55


  • La razón por la que mencioné Go 1.5 fue porque ese documento menciona específicamente la posibilidad de crear archivos de objetos compartidos o archivos de almacenamiento que pueden ser llamados por sistemas que no esperan código Go Está marcado en la sección llamada “Código Go vinculado y llamado desde , un programa no Go” en este enlace docs.google.com/document/d/…

    – pavoroso

    26 de agosto de 2015 a las 1:07

  • Dave C está en el camino–blog.filippo.io/building-python-modules-with-go-1-5 tiene más (en el contexto de conectar Go to Python a través de c-shared archivar y cgo exportaciones), pero no tengo tiempo para convertir eso en una respuesta coherente en este momento. Sin embargo, parece que ahora puedes usar Go from C.

    – dosdosdos

    26 de agosto de 2015 a las 1:47


  • mencioné cgo no como una forma de interactuar con el código C, sino como la forma en que necesita marca qué funciones desea exportar y llamar desde C (básicamente solo un //export … comentario). Como menciona mi comentario, esto se describe en el documento exacto al que se vincula.

    – Dave C.

    26 de agosto de 2015 a las 17:21


  • pregunta miscelánea: ¿hay alguna forma de hacer que esto funcione cuando se realiza una compilación cruzada para Windows desde OSX? esta parte fallará: GOOS=windows GOARCH=amd64 go build -buildmode=c-archive foo.go

    – mwag

    16 de octubre de 2016 a las 4:05

  • IIRC, CGo se deshabilita de forma predeterminada cuando se realiza una construcción cruzada. Puedes volver a habilitarlo con CGO_ENABLED=1pero también deberá proporcionar compiladores C/C++ para el arco de destino con CC_FOR_TARGET y CXX_FOR_TARGET como se describe en golang.org/cmd/cgo. Sin embargo, no tengo consejos específicos para compilar para Windows en OSX.

    – James Henstridge

    17 de octubre de 2016 a las 9:13

  • ¿Cómo lo harías en Windows? Especialmente cuál sería el reemplazo de pthread?

    – Royi

    18 de abril de 2021 a las 12:18

  • @Royi: Hace años que no desarrollo para Windows. Si normalmente no necesitaría un indicador de compilador especial para construir un programa C que use subprocesos, entonces lo más probable es que tampoco necesite hacer nada especial aquí.

    – James Henstridge

    19 abr 2021 a las 15:44

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad