git2go с libssl и libssh2 в одном бинарнике

Может ли кто-нибудь предложить некоторые предложения (или ресурсы) о том, как я могу упаковать программу GO, которая использует git2go, libssl и libssh2, чтобы конечный пользователь не требовал отдельной установки этих библиотек?

Я ориентируюсь только на дистрибутивы Linux (если это имеет значение)


person Sthe    schedule 18.12.2015    source источник
comment
В репозитории git2go есть несколько скриптов для создания статической сборки. Вы пробовали это?   -  person JimB    schedule 18.12.2015
comment
Когда мне нужен код C, статически скомпилированный с моим кодом go (например, Sqlite), я обычно просто делаю go install -tags netgo -ldflags '-extldflags "-static"'.   -  person Ainar-G    schedule 18.12.2015
comment
Makefile использует эти скрипты, и они создают файл статического объекта libgit2.a, но после сборки моей программы я получаю error while loading shared libraries: libhttp_parser.so.2.1: cannot open shared object file: No such file or directory. Вот один из флагов, которые появляются при запуске сборки -L/usr/local/lib -lgit2 -lhttp_parser -lssh2 -lgcrypt -lrt -lssl -lcrypto -ldl -lz   -  person Sthe    schedule 18.12.2015
comment
Это способ статической сборки libgit2 в git2go, внешние библиотеки по-прежнему загружаются динамически по результату.   -  person Carlos Martín Nieto    schedule 18.12.2015


Ответы (1)


Одним из способов было бы создать эти зависимости также статически и использовать PKG_CONFIG_PATH точку для ваших собственных копий, чтобы все было связано статически. Это должно заставить CMake выбирать статические версии.

Но если цель состоит в том, чтобы избежать зависимости от установленных пользователем библиотек, а не сделать все одним исполняемым файлом, я бы рекомендовал отправлять библиотеки и работать с путем загрузки, чтобы убедиться, что они загружаются. С gcc вы должны передать -Wl,-R, чтобы задать путь поиска в самом двоичном файле, чтобы вы могли указать, где искать общие библиотеки, которые вы отправляете со своим приложением. С go похоже, что вы можете передать -r компоновщику (через -ldflags или вручную), чтобы сделать то же самое.

libgit2 довольно расширяемый, поэтому есть третий вариант — реализовать поток TLS и транспорт SSH в Go и подключить их к версии libgit2 без их поддержки. Однако это значительный объем работы.

person Carlos Martín Nieto    schedule 18.12.2015
comment
Спасибо, Карлос. Ваше предложение сработало как шарм. Я разветвил репозиторий git2go и добавил новое правило make для достижения этой цели. См. ссылку ниже. Как вы думаете, стоит ли делать запрос на вытягивание? github.com/sithembiso/git2go/blob/next/Makefile#L16 - person Sthe; 20.12.2015
comment
Я хотел бы внести свой вклад в третий вариант после моего текущего проекта. Несмотря на то, что сделанные мной изменения решили мою проблему на данный момент, они увеличили размер моего двоичного файла с 19MB до 23MB. Кроме того, сборка для разных платформ сейчас требует большой осторожности. - person Sthe; 20.12.2015
comment
Встраивание нескольких криптографических библиотек в git2go — это не то, что я думаю, что исходный проект должен иметь в своем коде, но TLS и SSH — это то, что вы получаете с самим Go, поэтому мы должны использовать это. Он также помогает обходить бессмыслицу многопоточности OpenSSL. - person Carlos Martín Nieto; 23.12.2015