Я создаю оболочку Go для сторонней библиотеки C. Эта оболочка должна работать на Windows, Ma c и Linux.
Я использовал cgo, и оболочка отлично работает на всех трех платформ. Теперь для распространения пакет размещен в github. Я добавил следующие ldflags в коде:
/*
#cgo linux LDFLAGS: -L./libs -lMyLib -Wl,-rpath,./libs -Wl,-rpath,./
#cgo darwin LDFLAGS: -L./libs -lMyLib -Wl,-rpath,./libs -Wl,-rpath,./
#cgo windows LDFLAGS: -L./libs -lMyLib
#include "mylib/MyLib.h"
#include <stdlib.h>
*/
import "C"
Когда я пытаюсь go get -u github.com/mycompany/mylib-go
в любом примере приложения go, это дает ошибку компоновки на всех трех платформах. Что-то вроде:
ld: library not found for -lMyLib
Я заметил, что для этого libMyLib.dylib
, libMyLib.so
и MyLib.dll
должны присутствовать в рабочем каталоге примера приложения, а также в GOROOT/src/github.com/mycompany/mylib-go/libs
, где пакет установлен.
Поэтому для компоновки во время сборки он ищет библиотеку в GOROOT/src/github.com/mycompany/mylib-go/libs
, а во время выполнения ищет библиотеку в текущем рабочем каталоге.
Так что мне нужно для фиксации общих библиотек в моем репозитории git, и пользователям необходимо также включить библиотеку в свое приложение.
Этого можно как-то избежать, как, например, общая библиотека должна требоваться только в примере пользователей каталог приложения, и компоновщик будет использовать этот путь вместо его поиска в каталоге пакета?