2012-06-21 3 views
6

Я пытаюсь написать Go wrapper, используя CGo для ENet.Условная компиляция в Go

Когда я попытался скомпилировать мою обертку на Mac, библиотека была старше и имела немного другой интерфейс. 99% кода - это то же самое, что требуется только для нескольких вызовов C.

Какова наилучшая практика для решения такой проблемы в Go?
Есть ли способ сделать условную компиляцию или условный импорт?

ответ

1

Go не имеет условной компиляции или условного импорта. Обрабатывайте различия типов в коде C.

Are the [Go] authors opposed to preprocessing?

+0

Go на самом деле имеет условную компиляцию с использованием суффиксов имен файлов, как демонстрирует ответ andyBallholm. –

+1

Downvoters собираются ненавидеть :). Серьезно, хотя, @peterSO имеет правильный ответ для моей конкретной проблемы. Оказывается, Mac - это красная селедка. Реальная проблема связана с версиями библиотек, которые могут быть обнаружены только как '# define' в файлах заголовков. '_darwin.go' или' _linux.go' только замаскирует проблему, пока один из них не обновит свою библиотеку ENet с несовместимым изменением. –

14

Выделим конкретной платформы вещи в отдельный файл, например, stuff.go

Теперь замените stuff.go с версиями для разных платформ, как stuff_darwin.go (для Mac), stuff_windows.go, stuff_linux.go и т.д.

Если файл имеет суффикс подобное , команда go будет компилировать ее только на указанной платформе.

+0

Это действительно приятно знать. –

+8

Документировано в разделе «Build Constriants» в [обзор] (http://golang.org/pkg/go/build/#overview) пакета go/build. – Sonia

+1

Это действительно блестящее решение (оно подходит Go). –

Смежные вопросы