Ошибка при подклюении кода Си к 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 шт):

Автор решения: Сергей Во
  1. Убрать пустую строку между CGO preamble и обьявлением import "C":

    /*
    #cgo CXXFLAGS: -std=c++11
    #cgo LDFLAGS: -lstdc++
    #include "mylib.h"
    */
    
    import "C"
    
  2. сделать макросом 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
    
  3. Скомпилировать С++ файл в обьектный:

    g++ -c -std=c++11 mylib.cpp -o mylib.o
    
  4. добавить mylib.o к параметрам линковки в файле main.go:

    /*
    #cgo CXXFLAGS: -std=c++11
    #cgo LDFLAGS: -lstdc++ mylib.o
    #include "mylib.h"
    */
    

Спасибо user7860670 за ответ.

→ Ссылка