Можно ли использовать переменные среды в комментарии 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 каталог, но не допускает большой гибкости, когда другие разработчики работают с другой настройкой файловой системы (им всем нужны библиотеки, чтобы быть в C:/dev/extlibs/...).
есть ли способ ссылаться на переменную среды из кода? Возможно, что-то вроде:
// #cgo windows CFLAGS: -I $EXTLIBS$/include/
или есть другой способ, которым люди решают эту проблему, которую я пропустил? Я потратил некоторое время на поиск по этому вопросу и не видел много полезного, поэтому любая информация и/или ресурсы могут быть реальной помощью!
2 ответов
вы можете попробовать используя переменные окружения,страница 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
он доступен для windows (http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/) и есть еще некоторая информация об установке его в этот вопрос (Как установить конфигурацию pkg в windows?)
кроме этого, поместите все зависимости в подкаталог go-кода, используйте относительные пути в своем CFLAGS
и LDFLAGS
, и поделиться всем пакетом с другими разработчиками.
по словам документы для CGO:
при построении, CGO_CFLAGS, CGO_CPPFLAGS, CGO_CXXFLAGS и Переменные среды CGO_LDFLAGS добавляются к флагам, производным от настоящая директива. Флаги пакета должны быть установлены с помощью директивы, а не переменные среды, так что сборки работают в неизмененные средах.
используя эти знания, у меня был успех в создании сторонний пакет, который обертывает A C library пока он предоставляет его как системный пакет. Пример, который я связал с:
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.