LINUX.ORG.RU

Как поставлять golang-пакеты собранные с вовлечением C++.

 


0

2

Есть golang пакет, который собирается с использованием куска C++ кода и линкуется с парой библиотек - моей и одной стандартной. В основном файле zuzuzu.go имеются cgo-параметры и определён интерфейс этого пакета. Пакет предоставляет методы, допустим Put() и Get(). Пишу кусок кода по памяти, мог накосячить с синтаксисом, но это не суть - этот кусок не надо пытаться собрать)

package zuzuzu

// #cgo LDFLAGS: -lmy_special_lib
// #cgo LDFLAGS: -lstdc++
...

func Put(a string) {
...
}

func Get() string {
...
}

На выходе получается файлик

${GOPATH}/pkg/linux_amd64/zuzuzu.a

Я раньше думал, что можно взять один этот zuzuzu.a и там будут встроены все символы, которые понадобятся go чтобы понять что это за пакет, какие методы у него есть. Теперь оказывается, что zuzuzu.go юзеру тоже нужен. Но если юзеру отдать zuzuzu.go, то его go начнёт исполнять cgo-директивы и потребует мою библиотеку и доступ к C++ библиотекам. А хотелось отдать юзеру что-то, что не требовало бы от юзера него установленных в системе C++ библиотек и сборки моей библиотеки. Естественно, юзер на той же платформе, допустим.

Как я думал раньше я написал. Теперь я так не думаю, но желание-то осталось: хочется отдать юзеру пакет, собранные из C++ кода и моих либ, но позволяющий себя юзать без знаний о моём C++ коде и без знаний о том, где взять эти либы.

Как это сделать?

P.S. Под «поставлять» я не имею ввиду оформление доступа к разным частям проекта или юридически-лицензионные аспекты дистрибуции ПО. Типа тут один гитхабчик, тут другой гитхабчик, тут лицензия такая, тут такая. Интересна физическая сторона дела: юзер копирует себе на диск только файл .go и только файл .a, при этом его go не пытается ломиться к моим либам.



Последнее исправление: cetjs2 (всего исправлений: 4)

А хотелось отдать юзеру что-то, что не требовало бы от юзера него установленных в системе C++ библиотек и сборки моей библиотеки.

Никак, cgo использует динамическую линковку же

Теперь оказывается, что zuzuzu.go юзеру тоже нужен

што

derlafff ★★★★★
()
Ответ на: комментарий от derlafff

Я отдаю юзеру zuzuzu.go, в этом файле прописана возня с линкером и с C++. Используя zuzuzu.go юзер вынуждает go обращаться к указанным библиотекам.

Вопрос: как отдать только zuzuzu.a и некую замену zuzuzu.go?

hlamotron
() автор топика
Ответ на: комментарий от derlafff

С исходниками, но не с C++ исходниками. Юзер этого пугается. У меня конкретный юзер, который не хочет видеть никаких C-библиотек и C-кода. Ему нужен чёрный ящик максимум с интерфейсом в виде zuzuzu.go

hlamotron
() автор топика
Ответ на: комментарий от hlamotron

Что-то я не уверен, что выйдет. Это не сишечка же и хидер-файлов тут нет, только исходники.

Как вариант — собрать динамическую либу из твоей библиотеки (собрав все сторонние либы статически в неё) и поставлять её с zuzuzu.h.

Но тогда вызовы из go будут через cgo, а это таки неэффективно

derlafff ★★★★★
()
Ответ на: комментарий от hlamotron

Тогда положи все хидеры рядом с кодом. Вместо -lmy_special_lib делай include "my_special_lib.h". Должно собираться, но запускаться будет только когда .so в зоне доступности

derlafff ★★★★★
()
Последнее исправление: derlafff (всего исправлений: 3)
Ответ на: комментарий от derlafff

У меня нет никаких .so, всё статически линкуется.

hlamotron
() автор топика
Ответ на: комментарий от derlafff

Под «поставлять» я не имею ввиду оформление доступа к разным частям проекта. Типа тут один гитхабчик, тут другой гитхабчик. Интересна физическая сторона дела: юзер копирует себе на диск только файл .go и только файл .a, при этом его go не пытается ломиться к моим либам.

hlamotron
() автор топика
Ответ на: комментарий от hlamotron

Значит, ты пытаешься из go-файла сделать хидер. Не выйдет, кмк, компилятор не рассчитывает на такое жестокое обращение. И, например, при несоответствии версии компилятора будет твой .a пытаться пересобрать

derlafff ★★★★★
()
Последнее исправление: derlafff (всего исправлений: 1)
2 ноября 2016 г.
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.