使用Swig从c ++调用

问题描述 投票:0回答:1

我正在使用Swig将Go语言与c ++链接,但是我想在我的c ++代码中使用go函数。我以前使用过cgo,并且知道这样可以工作:

//bind.h
extern void GoFunc(*C.char);
void CFunc();
//////////////////


//bind.cc
void CFunc() {
  //do stuff
}
//////////////////


//main.go
package main

//#include "bind.h"
import "C"

//export GoFunc
func GoFunc(*C.char) {
  //do go stuff
}

func main() {
  C.CFunc()
}
//////////////////

但是当我尝试用swig复制时,

//bind/bind.i
%module bind
%{
  extern void Foo();
  #include "bar.hpp"
%}

%include <typemaps.i>
%include "bar.hpp"
///////////////////////////


//bind/bar.hpp
class Bar {
  Bar() {}
  void Call() {
    Foo();
  }
};
///////////////////////////


//main.go
package main

import "fmt"
import "test/bind"

//export Foo
func Foo() {
  fmt.Println("FOO WAS CALLED")
}

func main() {
  bar := bind.NewBar()
  bar.Call()
}
///////////////////////////

我收到以下编译器错误:

In function `_wrap_Foo_bind_2f8d0a395235e7eb':
bind/bind_wrap.cxx:274: undefined reference to `Foo()'
collect2.exe: error: ld returned 1 exit status

为什么此代码在cgo中起作用,但在swig中不起作用,我如何在swig中实现相同的功能?

c++ go swig cgo
1个回答
0
投票

链接和语言链接

//bind/bind.i
%module bind
%{
  extern void Foo();
  #include "bar.hpp"
%}

extern关键字在C ++上在语义上非常重载。如上使用时,它是一个storage class specifier,当应用于一个函数时,它指定它具有外部linkage。函数Foo()已经具有外部链接,但是,您可能打算使用应用于externlanguage linkage关键字:

//bind/bind.i
%module bind
%{
  extern "C" void Foo();
  #include "bar.hpp"
%}

这将提供Foo() C语言链接,其结果是正确的名称,足以使其成功与其Go定义链接。

© www.soinside.com 2019 - 2024. All rights reserved.