【问题标题】:golang build with gcc instead of g++golang 使用 gcc 而不是 g++ 构建
【发布时间】:2020-07-17 04:00:43
【问题描述】:

我正在尝试构建调用 c++ 创建的 Go,在 Linux 上创建 .so (a.so) 文件,但我发现 go build . 命令总是使用 gcc 构建 NOT g++。我已经将.cpp 放在了根目录中,而不是放在子目录中。

这是go build 命令的输出

client.go:90:10: could not determine kind of name for C.Init
cgo:
gcc errors for preamble:
In file included from client.go:8:
a.h:34:1: error: unknown type name 'class'
   34 | class A {
      | ^~~~~
a.h:34:11: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
   34 | class A {
      |           ^               ^

这里是client.go调用C代码:

package main

// #cgo windows LDFLAGS: -la
// #cgo windows CXXFLAGS: -DWINDOWS
// #cgo linux LDFLAGS: -liba
// #cgo LDFLAGS: -L./libs
// #cgo CXXFLAGS: -I./
// #include "a.h"
import "C"

func function() {
    handle, _ := dlOpen(PATH_TO_SO_FILE)
    blob := C.Init(handle)
}

这里是dlOpen相关代码,用Go写的:

// +build linux

package main

// #cgo linux LDFLAGS: -ldl
// #include <dlfcn.h>
// #include <stdlib.h>
import "C"

import "errors"
import "unsafe"

type Handle {
    c unsafe.Pointer
}

func dlOpen(filename string) (Handle, error) {
    ptr := C.CString(filename)
    defer C.free(unsafe.Pointer(ptr))
    ret := C.dlopen(ptr, C.RTLD_LAZY)
    if ret != nil {
        return Handle{ret}, nil
    }
    return Handle{ret}, errors.New(C.GoString(C.dlerror()))
}

这里是a.h

class A {
    public:
        Init(MHANDLE handle);
}

【问题讨论】:

标签: go cgo


【解决方案1】:

您的问题不在于 cpp 文件。
你在 go 文件中写了 // #include "a.h".
Go 目前将其编译为 c,并且不支持 c++,而且看起来永远不会支持。
您唯一的选择是使头文件在 c 中有效。

【讨论】:

    猜你喜欢
    • 2015-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    • 2011-10-01
    • 2011-12-17
    相关资源
    最近更新 更多