Как я могу написать переносимый код Go, который будет вызывать общую библиотеку C для Windows и Linux? - PullRequest
0 голосов
/ 24 апреля 2020

Я пишу / поддерживаю Go программу, которая будет работать на нескольких операционных системах, включая, по крайней мере, Windows и Linux (это единственные, которые меня сейчас интересуют).

Необходимо вызвать C код, который находится в разделяемой библиотеке (альтернативой может быть переопределение кода библиотеки в Go, что будет непомерно дорого - быстрее будет переопределить Go код в C). На каждой платформе существует общая библиотека с известным именем (например, mystuff.dll, libmystuff.so), и каждая библиотека содержит функции, которые мне нужно вызывать из Go, с такими же именами и прототипами.

Я нашел много противоречивых советов о том, как заставить совместно используемые библиотеки работать в Windows или Linux, но я ищу решение, которое работает для обоих. LoadDll , кажется, windows -только вещь, syscall возможно устарел есть модуль 'dl' с документацией "почти нет" и нет обновления в течение 5 лет, и это трудно гуглить, потому что 'dl' теперь там, где хранятся некоторые из Go версий, а также сама страница загрузки go и, возможно, рассматривается в Google как синоним слова «скачать».

Я хотел бы что-то, что говорит:

В общей библиотеке с назовите C используйте , используя <эти значения>, и присвойте возвращаемое значение .

Я думаю, что мой единственный вариант может быть cgo, но если есть какие-либо другие варианты, они могут избежать необходимости устанавливать компилятор C на каждой сборочной машине (чтобы сделать его более увлекательным, * * версия 1023 * MingGW-w64 g cc не работает с cgo на 64-битной Windows ...).

Этот вопрос решает аналогичную проблему, но я хочу вызывать функции в общей библиотеке, которую я не считаю системным вызовом.

...