Как использовать разделяемую библиотеку C ++ в коде Go с помощью SWIG? - PullRequest
1 голос
/ 22 сентября 2019

У меня есть сторонняя библиотека C ++ .so , которую я хочу использовать в моем коде Go .Я могу заставить его работать с простым C / C ++, но не могу подключиться к Go.

Библиотека имеет большой заголовочный файл, и нужная мне функция объявлена ​​в ней так (переименовано для более простого вида):

typedef unsigned long (*INTERFACE_EXAMPLE_FUNC)(int example_var);
#ifdef PC_STATIC_LIBS
extern "C" unsigned long Example_func(int example_var);
#endif //PC_STATIC_LIBS

(я полагаю, проще связать статическую библиотеку, поэтому я помещаю #define PC_STATIC_LIBS поверх заголовка)

Я провел много часовпытаясь связать эту библиотеку без SWIG, но cgo не будет анализировать заголовок C ++, что дает мне массу сообщений об ошибках.Итак, я пытаюсь использовать SWIG сейчас.В настоящее время мой файл интерфейса Swig example.i выглядит следующим образом:

%module example
 %{
 #include "libheader.h"
 extern unsigned long Example_func(int example_var);
 %}
 extern unsigned long Example_func(int example_var);

Шаги, которые я предпринимаю:

  1. Запустить команду swig:swig -go -cgo -c++ -intgosize 64 -use-shlib -soname examplelib.so example.i
  2. go install

Полученные результаты:

/usr/bin/ld: $WORK/b001/_x003.o: in function `_wrap_Example_func_examplelib_8c0447b5964daffe':
./examplelib_wrap.cxx:302: undefined reference to `Example_func'
collect2: error: ld returned 1 exit status

Все используемые файлы находятся втот же каталог.У меня также есть копия библиотеки, размещенная в моем / usr / local / lib, и ldconfig -p показывает ее.

Что я здесь не так делаю?

1 Ответ

0 голосов
/ 22 сентября 2019

Мне удалось наконец связать разделяемую библиотеку C ++ с моим кодом Go, добавив дополнительные теги компиляции cgo в файл .go, созданный SWIG.Это было неочевидно, так как я думал, что SWIG не нуждается в дополнительных настройках после запуска.

Итак, две строки кода, которые устраняют проблему:

#cgo CFLAGS: -std=c99
#cgo LDFLAGS: -L. -l:examplelib.so

LDFLAGS говорит, что нужно искать библиотеку 'examplelib.so' в текущем пути.

...