2013-06-05 18 views
11

Sto tentando di scrivere alcuni binding C per la lingua Go e ho incontrato una sorta di situazione appiccicosa durante l'installazione della compilation Cgo in Windows. Ho codice che è simile al seguente:È possibile utilizzare le variabili di ambiente in un commento CFLAGS cgo?

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

che mi permette di evitare l'installazione di DLL, librerie e file di intestazione direttamente nel mio directory C: \ Windows, ma non consente molta flessibilità quando altri sviluppatori stanno lavorando con una diversa configurazione del file system (tutti hanno bisogno che le librerie siano in C:/dev/extlibs/...).

C'è un modo per referenziare una variabile di ambiente all'interno del codice? Forse qualcosa sulla falsariga di:

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

O c'è un altro modo in cui le persone a risolvere questo problema che ho perso? Ho passato un po 'di tempo a googling su questo argomento e non ho visto molto che sia stato utile, quindi qualsiasi informazione e/o risorsa potrebbe essere un vero aiuto!

risposta

7

Si potrebbe provare utilizzando le variabili di ambiente, il Gentoo Linux Wiki page on Safe C Flags ha un esempio nel seguente formato

CXXFLAGS="${CFLAGS}" 

Così si può essere in grado di fare qualcosa di simile

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

ma la mia sintassi possono essere spento, e potrebbe essere specifico per Makefile.

Si potrebbe anche provare a impostare un CPATH environment variable cui:

Specifica un elenco di directory da cercare come se specificato con -I, ma dopo gli eventuali percorsi specificati con le opzioni -I sulla riga di comando. Questa variabile d'ambiente viene utilizzata indipendentemente da quale lingua viene sottoposta a pre-elaborazione.

L'equivalente per -L è, credo, LIBRARY_PATH (descritta al link CPATH).

Secondo http://golang.org/cmd/cgo/ uno sorta di modo consigliato per ottenere intorno a questo in modo indipendente dalla piattaforma è quello di utilizzare pkg-config.

// #cgo pkg-config: mylib otherlib 

E 'disponibile per Windows (http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/) e c'è qualche informazione in più su di installarlo a this question (How to install pkg config in windows?)

Oltre a questo, mettere tutte le dipendenze in una sotto-directory del go-codice, utilizzare i percorsi relativi nel tuo CFLAGS e LDFLAGS e condividi l'intero pacchetto con altri sviluppatori.

+0

Queste sono alcune buone idee. Darò loro una prova. FWIW, io uso pk-config su darwin/linux, ma è sempre sembrato un po 'più difficile di quanto valesse su Windows in passato. –

+0

@ChrisCovert Sì, mi ci è voluto un po 'per risolvere le dipendenze su Win8 :-(Alla fine, però, quella domanda collegata SO ha alcuni buoni link nei commenti. – Intermernet

+0

FWIW, penso che sto andando a dare una prova a pkg-config e vedere se funziona un po 'meglio dell'ultima volta. Grazie per le risorse! –

13

Secondo il docs for CGO:

Quando si costruisce, il CGO_CFLAGS, CGO_CPPFLAGS, CGO_CXXFLAGS e variabili d'ambiente CGO_LDFLAGS vengono aggiunti alle bandiere derivati ​​da queste direttive.I flag specifici del pacchetto devono essere impostati utilizzando le direttive , non le variabili di ambiente, in modo che le build funzionino negli ambienti non modificati .

Utilizzando questa conoscenza, ho avuto successo nella creazione di un third-party package that wraps a C library fintanto che lo fornisce come pacchetto di sistema. L'esempio che ho collegato a:

package sdl 

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

Anche se si specifica un pacchetto di sistema per SDL2, e ho SDL2 installato in una directory non di sistema, sono in grado di costruire ancora questo pacchetto utilizzando alcune delle variabili d'ambiente I menzionato, come nel seguente:

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 

Ovviamente, questo è Linux, ma probabilmente è possibile utilizzare le stesse idee in Windows.

Problemi correlati