首页 > 解决方案 > 如何从嵌入在 cgo 中的 C 代码调用 Go 函数

问题描述

这是超级基本的,为基本的问题道歉。我有 Go 代码,它调用一个 C 函数(通过 cgo 嵌入到同一个 Go 包中),它应该回调另一个 Go 函数。调用 C 代码有效,代码编译,但在链接时,C 链接器找不到 Go 函数。

cpoc % go build .
# cpoc
Undefined symbols for architecture x86_64:
  "_goLogger", referenced from:
      _cLogger in _x003.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
poc % 

cpoc.go

package main

// #cgo pkg-config: vips
// #include "cpoc.h"
import "C"
import (
    "fmt"
)

// export goLogger
func goLogger() {
    fmt.Println("goLogger")
}

func main() {
    C.cLogger()
}

cpoc.h

#include <stdlib.h>
#include <stdio.h>
#include <glib.h>

extern void goLogger(void);

void cLogger(void);

cpoc.c

#include "cpoc.h"

void cLogger(void)
{
    printf("cLogger\n");
    goLogger();
}

标签: cgocgo

解决方案


// 和 export 之间的空格导致函数无法导出。

根据@kostix 评论回答,这是正确的。


推荐阅读