Можно ли использовать переменные среды в комментарии 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.