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