Ошибка при подклюении кода Си к Go проекту
Не могу сбилдить простейший проект на golang с подключением Си
main.go
:
package main
/*
#cgo CXXFLAGS: -std=c++11
#cgo LDFLAGS: -lstdc++
#include "mylib.h"
*/
import "C"
import "fmt"
func main() {
a := 5
b := 10
result := C.add(C.int(a), C.int(b))
fmt.Printf("Result of add(%d, %d) = %d\n", a, b, int(result))
}
mylib.cpp
:
#include "mylib.h"
int add(int a, int b)
{
return a + b;
}
mylib.h
:
#ifndef MYLIB_H
#define MYLIB_H
extern "C" {
int add(int a, int b);
}
#endif
Ошибка:
go build -x -o myprogram main.go
WORK=/tmp/go-build82245532
mkdir -p $WORK/b001/
cd /home/anon/GolandProjects/CGO
TERM='dumb' CGO_LDFLAGS='' /usr/local/go/pkg/tool/linux_amd64/cgo -objdir $WORK/b001/ -importpath command-line-arguments "-ldflags=\"-O2\" \"-g\"" -- -I $WORK/b001/ -O2 -g ./main.go
# command-line-arguments
./main.go:15:12: could not determine kind of name for C.add
ОС Linux
CGO_ENABLED=1
gcc -c mylib.cpp -o mylib.o
- компилирует без ошибок
Ответы (1 шт):
Автор решения: Сергей Во
→ Ссылка
Убрать пустую строку между
CGO preamble
и обьявлениемimport "C"
:/* #cgo CXXFLAGS: -std=c++11 #cgo LDFLAGS: -lstdc++ #include "mylib.h" */ import "C"
сделать макросом
extern "C"
в файле заголовкаmylib.h
:#ifndef MYLIB_H #define MYLIB_H #ifdef __cplusplus extern "C" { #endif int add(int a, int b); #ifdef __cplusplus } #endif #endif
Скомпилировать С++ файл в обьектный:
g++ -c -std=c++11 mylib.cpp -o mylib.o
добавить
mylib.o
к параметрам линковки в файлеmain.go
:/* #cgo CXXFLAGS: -std=c++11 #cgo LDFLAGS: -lstdc++ mylib.o #include "mylib.h" */
Спасибо user7860670 за ответ.