У меня есть большой проект, написанный на C, и я написал скрипт Go с функцией, которую я хотел бы вызвать из кода C ( C-> Go ).Эта же функция Go также должна вызывать некоторые функции языка Си ( Go-> C ).
Вот упрощенный взгляд на структуру проекта:
- src/...
- src/file_c.h
- src/file_c.c
- src/gocode/file_go.go
- src/Makefile
Здесьэто то, что я хотел бы сделать:
file_c.c
должен включать file_go.h
(C-> Go). file_go.go
должен включать file_c.h
(Go-> C). - Программное обеспечение C имеет свой собственный большой Makefile, и я хотел бы продолжать использовать его для компиляции.Последний исполняемый двоичный файл также будет из существующего кода C (и будет вызывать функцию Go во время его выполнения).
Что я пробовал до сих пор:
В файле file_go.go
перед оператором import "C"
я добавил следующие строки:
// #cgo CFLAGS: -I..
// #include "file_c.h"
Затем я попытался скомпилировать file_go.go
обеими командами:
go build -buildmode=c-shared file_go.go
go build -buildmode=c-archive file_go.go
Однако в обоихя получаю сообщения об ошибках вида undefined reference to func
, где func
- это функция C (объявленная в file_c.h
и определенная в file_c.c
), вызываемая из кода Go.
Если я удаляю вызовыиз Go-> C в file_go.go
, тогда он компилируется правильно, и я могу правильно включить file_go.h
в C Makefile.Однако мне нужен файл Go для вызова этой функции C.
Как мне создать файл Go таким образом, чтобы функция C была правильно связана?