variable sirven que para modificar las entorno crear linker go cgo

linker - sirven - variables de entorno linux



¿Es posible usar variables de entorno en un comentario de cgo CFLAGS? (2)

Estoy intentando escribir algunos enlaces C para el idioma Go, y me he encontrado con una especie de situación complicada al configurar la compilación Cgo en Windows. Tengo un código que se parece a lo siguiente:

// #cgo windows CFLAGS: -I C:/dev/extlibs/include/ // #cgo windows LDFLAGS: -lMyLib -L C:/dev/extlibs/lib/ // #include <mylib/mylib.h> import "C"

lo cual me permite evitar la instalación de Dlls, Libs y archivos de encabezado directamente en mi directorio C: / Windows, pero no permite mucha flexibilidad cuando otros desarrolladores están trabajando con una configuración de sistema de archivos diferente (todos necesitan las librerías para estar en C: / dev / extlibs / ...).

¿Hay alguna manera de que pueda referir una variable de entorno desde dentro del código? Tal vez algo como:

// #cgo windows CFLAGS: -I $EXTLIBS$/include/

¿O hay otra forma en que las personas resuelvan este problema que me he perdido? Pasé un tiempo buscando en Google sobre este tema y no he visto mucho que haya sido útil, ¡así que cualquier información y / o recurso podría ser una gran ayuda!


De acuerdo con los documentos para CGO :

Al compilar, las variables de entorno CGO_CFLAGS, CGO_CPPFLAGS, CGO_CXXFLAGS y CGO_LDFLAGS se agregan a los indicadores derivados de estas directivas. Los indicadores específicos del paquete deben establecerse utilizando las directivas, no las variables de entorno, para que las compilaciones funcionen en entornos no modificados.

Utilizando este conocimiento, he tenido éxito en la creación de un paquete de terceros que envuelve una biblioteca C siempre que lo proporcione como un paquete del sistema. El ejemplo al que me he vinculado:

package sdl // #cgo LDFLAGS: -lSDL2 // #include <SDL2/SDL.h> import "C"

Aunque especifica un paquete de sistema para SDL2, y tengo SDL2 instalado en algún directorio que no sea del sistema, aún puedo construir este paquete usando algunas de las variables de entorno que mencioné, como las siguientes:

export SDL_PATH=/home/mark/where/I/installed/sdl CGO_CFLAGS="-I$SDL_PATH/include" CGO_LDFLAGS="-L$SDL_PATH/lib" go build hello.go LD_LIBRARY_PATH="$SDL_PATH/lib" ./hello

Por supuesto, esto es Linux, pero probablemente puedas usar las mismas ideas en Windows.


Puede intentar usar variables de entorno, la página Wiki de Gentoo en Safe C Flags tiene un ejemplo en el siguiente formato

CXXFLAGS="${CFLAGS}"

Entonces puedes hacer algo como

// #cgo windows CFLAGS: -I "${EXTLIBS}"/include/

pero mi sintaxis puede estar desactivada, y eso puede ser específico de Makefile.

También podría intentar configurar una variable de entorno de CPATH que:

especifica una lista de directorios para buscar como si se especificara con -I, pero después de cualquier ruta dada con -I opciones en la línea de comando. Esta variable de entorno se usa independientemente del idioma que se está preprocesando.

El equivalente para -L es, creo, LIBRARY_PATH (Descrito en el enlace CPATH ).

De acuerdo con http://golang.org/cmd/cgo/, un tipo de método recomendado para evitar esto en una plataforma de manera independiente es usar pkg-config .

// #cgo pkg-config: mylib otherlib

Está disponible para Windows ( http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/ ) y hay más información sobre cómo instalarlo en esta pregunta (¿Cómo instalar pkg config en Windows?)

Aparte de eso, coloque todas las dependencias en un subdirectorio de go-code, use rutas relativas en sus CFLAGS y LDFLAGS , y comparta todo el paquete con otros desarrolladores.