Можно ли использовать переменные среды в комментарии cgo CFLAGS?
Я пытаюсь написать некоторые C-привязки для языка Go и столкнулся с какой-то липкой ситуацией при настройке компиляции Cgo в Windows. У меня есть код, который выглядит следующим образом:
// #cgo windows CFLAGS: -I C:/dev/extlibs/include/
// #cgo windows LDFLAGS: -lMyLib -L C:/dev/extlibs/lib/
// #include <mylib/mylib.h>
import "C"
что позволяет мне избегать установки файлов Dll, libs и заголовков непосредственно в мой каталог C:\Windows, но не позволяет обеспечить большую гибкость, когда другие разработчики работают с другой установкой файловой системы (все они нуждаются в libs, чтобы быть в C:/dev/extlibs/...).
Есть ли способ, с помощью которого я могу ссылаться на переменную среды внутри кода? Возможно, что-то вроде:
// #cgo windows CFLAGS: -I $EXTLIBS$/include/
Или существует другой способ, которым люди решают эту проблему, которую я пропустил? Я потратил некоторое время на поиски этой темы и не видел много полезного, поэтому любая информация и/или ресурсы могут быть реальной помощью!
Ответы
Ответ 1
Вы можете попробовать использовать переменные среды, Страница Gentoo Linux Wiki на флажках Safe C содержит пример в следующем формате
CXXFLAGS="${CFLAGS}"
Итак, вы можете сделать что-то вроде
// #cgo windows CFLAGS: -I "${EXTLIBS}"/include/
но мой синтаксис может быть выключен, и это может быть специфично для Makefile.
Вы также можете попробовать установить переменную среды CPATH
, которая:
указывает список каталогов, которые нужно искать, как если бы они указывались с -I, но после любых путей, заданных параметрами -I в командной строке. Эта переменная среды используется независимо от того, какой язык предварительно обрабатывается.
Эквивалент для -L
, я думаю, LIBRARY_PATH
(описан в ссылке CPATH
).
Согласно http://golang.org/cmd/cgo/ один из рекомендуемых способов обойти это на платформе независимо - использовать pkg-config.
// #cgo pkg-config: mylib otherlib
Он доступен для окон (http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/), и есть еще несколько сведений об установке его на этот вопрос (как установить pkg config в windows?)
Кроме этого, поместите все зависимости в поддиректорию go-кода, используйте относительные пути в CFLAGS
и LDFLAGS
, и поделитесь всем пакетом с другими разработчиками.
Ответ 2
В соответствии с документами для CGO:
При создании CGO_CFLAGS, CGO_CPPFLAGS, CGO_CXXFLAGS и Переменные среды CGO_LDFLAGS добавляются к флагам, полученным из эти директивы. Флаги, специфичные для пакета, должны быть установлены с помощью а не переменные среды, так что немодифицированные среды.
Используя эти знания, я добился успеха в создании стороннего пакета, который обертывает библиотеку C, пока он предоставляет ее как системный пакет. Пример, связанный с:
package sdl
// #cgo LDFLAGS: -lSDL2
// #include <SDL2/SDL.h>
import "C"
Несмотря на то, что он указывает системный пакет для SDL2, и я установил SDL2 в какой-то несистемный каталог, я могу по-прежнему создавать этот пакет с использованием некоторых переменных окружения, о которых я упоминал, например:
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
Конечно, это Linux, но вы, вероятно, можете использовать те же идеи в Windows.