Не удается выполнить кросс-компиляцию cgo (для darwin)

Я довольно новичок в работе и даже в Linux в целом.

Я создал приложение в среде Linux, в котором используется библиотека gtk на основе cgo (https://github.com/mattn/go-gtk/). Приложение отлично строится в своей родной среде (64-разрядная версия Linux), но когда я пытаюсь скомпилировать для 64-разрядной версии darwin, я получаю следующий результат:

# net
could not determine kind of name for C.AI_MASK
# net
could not determine kind of name for C.AI_MASK

Командная строка, которую я использую для сборки:

env GOOS=$1 GOARCH=$2 CGO_ENABLED=1 go build $3

Где $1 — darwin, $2 — amd64 (и $3 — путь к моему приложению).

Поскольку ошибка, похоже, исходит из библиотеки, которую я импортирую, я не знаю, что делать, чтобы ее исправить. Я также читал, что кросс-компиляция cgo на самом деле не работает, поскольку она основана на нативных материалах macos, поэтому ее нужно будет собирать на Mac. Это правда или я могу что-то сделать, чтобы заставить его работать в моей среде?

Я также немного смущен, так как кажется, что большинство людей, обсуждающих эту тему, говорят о версии go pre 1.5, которая, если я правильно понимаю, была совершенно другой, когда дело доходит до кросс-компиляции.

Спасибо


person Nicolas    schedule 04.12.2015    source источник
comment
У вас правильно настроены clang или gcc для кросс-компиляции?   -  person JimB    schedule 04.12.2015
comment
Я не уверен, что означает правильная настройка и как я могу проверить?   -  person Nicolas    schedule 07.12.2015
comment
Вы должны иметь возможность кросс-компилировать программу C, чтобы кросс-компилировать программу go, использующую cgo; пойти не может сделать это для вас. После настройки вы можете установить правильные переменные env, чтобы сообщить go, какой компилятор вызывать для запрошенной цели: golang.org/cmd/cgo   -  person JimB    schedule 07.12.2015
comment
Я не понимаю. У меня установлены gcc и clang (не уверен, какая настройка требуется), и я могу скомпилировать свою программу для linux 386 (собственный), так что не означает ли это, что она успешно компилирует код C? Я не понимаю, почему компиляция кода C отличается (и терпит неудачу), когда целью является darwin.   -  person Nicolas    schedule 21.12.2015
comment
Простого наличия компилятора C недостаточно для работы с другой ОС/архитектурой; вам также нужны все связанные заголовки и библиотеки, скомпилированные для цели. Компиляция в darwin из Linux не очень распространенная задача, но я видел репозиторий GH, который кто-то создал с помощью вспомогательных инструментов: github.com/tpoechtrager/osxcross.   -  person JimB    schedule 21.12.2015
comment
Спасибо за это - кажется, это то, что мне нужно. Я успешно установил набор инструментов, следуя инструкциям (уф!), но когда я пытаюсь скомпилировать свою программу даже для Linux 64 (родной), я получаю следующую ошибку: /usr/local/go/pkg/tool/linux_amd64/link: running o64-clang failed: exit status 1 ld: library not found for -lgobject-2.0 clang: error: linker command failed with exit code 1 (use -v to see invocation) Не знаю, что это значит... :/   -  person Nicolas    schedule 24.12.2015
comment
Хорошо, я понял, что, возможно, нет смысла пытаться использовать это для компиляции для Linux, поэтому теперь, когда я нацеливаюсь на darwin amd64, у меня возникают следующие ошибки: # github.com/mattn/go-gtk/pango ld: library not found for -lpango-1.0 clang: error: linker command failed with exit code 1 (use -v to see invocation) и # github.com/mattn/go-gtk/glib ld: library not found for -lgobject-2.0 clang: error: linker command failed with exit code 1 (use -v to see invocation) ; что это обозначает?   -  person Nicolas    schedule 24.12.2015


Ответы (1)


Теперь я могу успешно скомпилировать свой код на linux для darwin благодаря комментариям JimB.

Мне нужна была цепочка инструментов OSX, такая как github.com/tpoechtrager/osxcross.

Затем я скомпилировал свой код, выполнив env OSXCROSS_NO_INCLUDE_PATH_WARNINGS=1 MACOSX_DEPLOYMENT_TARGET=10.6 CC=o64-clang CXX=o64-clang++ GOOS=darwin GOARCH=amd64 CGO_ENABLED=1 go build -v mywork/myprogram.

Некоторые из моих программ успешно компилируются, некоторые выдают ошибки во время компоновки, но я думаю, что это еще одна проблема, поэтому я отмечу этот вопрос как решенный в отношении кросс-компиляции.

person Nicolas    schedule 29.12.2015