2012-06-21 20 views
6

Próbuję napisać Przejść wrapper użyciu CGo dla ENet.Warunkowa kompilacja Przejdź

Kiedy próbowałem skompilować moje opakowanie na komputerze Mac, biblioteka była starsza i miała nieco inny interfejs. 99% kodu jest takie samo, wystarczy kilka wywołań C, które trzeba zmienić.

Jaka jest najlepsza praktyka radzenia sobie z takim problemem w programie Go?
Czy istnieje sposób na kompilację warunkową lub import warunkowy?

Odpowiedz

1

Go nie ma kompilacji warunkowej ani importu warunkowego. Obsługuj różnice typów w kodzie C.

Are the [Go] authors opposed to preprocessing?

+0

Go faktycznie ma kompilację warunkową z użyciem sufiksów nazw plików, jak pokazuje odpowiedź andyBallholm. –

+1

Downwotnicy będą nienawidzić :). Poważnie jednak, @peterSO ma poprawną odpowiedź na mój konkretny problem. Okazało się, że Mac to czerwony śledź. Prawdziwym problemem są wersje bibliotek, które można wykryć tylko jako '# define' w plikach nagłówkowych. "_darwin.go" lub "_linux.go" maskowałoby tylko problem, dopóki jeden z nich nie zaktualizował swojej biblioteki ENET z niekompatybilną zmianą wsteczną. –

14

oddzielić rzeczy specyficzne dla platformy do osobnego pliku, na przykład stuff.go

Teraz zastąpić stuff.go w wersjach dla różnych platform, jak stuff_darwin.go (Mac), stuff_windows.go, stuff_linux.go itp

Jeżeli plik ma takiego przyrostka , polecenie go skompiluje tylko na określonej platformie.

+0

To naprawdę miłe wiedzieć. –

+8

Udokumentowane w "Build Constriants" w [overview] (http://golang.org/pkg/go/build/#overview) pakietu go/build. – Sonia

+1

To naprawdę genialne rozwiązanie (pasuje do Go). –