go - 无法从 go 运行 C 调用

标签 go cgo gccgo

我正在尝试从 go 语言代码运行 C 调用。这是我正在运行的程序:

package main

// #include<proxy.h>

import "C"
import "fmt"

func main(){
    fmt.Println(C.CMD_SET_ROUTE)
}

这是文件 proxy.h 的内容:

#ifndef PROXY_H
#define PROXY_H

#include <netinet/in.h>

#ifdef CMD_DEFINE
#   define cmdexport
#else
#   define cmdexport static
#endif

cmdexport const int CMD_SET_ROUTE = 1;
cmdexport const int CMD_DEL_ROUTE = 2;
cmdexport const int CMD_STOP      = 3;

现在,这是我在尝试运行该程序时遇到的错误:

pensu@ubuntu:~$ go run test.go 
# command-line-arguments
could not determine kind of name for C.CMD_SET_ROUTE

我正在使用 gccgo-5 和 go 版本 1.4.2。你能帮我弄清楚这里到底是什么问题吗? TIA。

最佳答案

四件事:

  • 在包含 proxy.h 时应使用双引号,因为它与 .go 文件位于同一目录中。
  • “C”注释和“C”导入前不能有空行。
  • 您在 proxy.h 末尾缺少一个 #endif
  • 您需要在包含proxy.h 之前定义CMD_DEFINE。否则,Go 无法访问静态变量。

修改后的代码如下:

package main

// #define CMD_DEFINE
// #include "proxy.h"
import "C"
import "fmt"

func main(){
    fmt.Println(C.CMD_SET_ROUTE)
}
#ifndef PROXY_H
#define PROXY_H

#include <netinet/in.h>

#ifdef CMD_DEFINE
#   define cmdexport
#else
#   define cmdexport static
#endif

cmdexport const int CMD_SET_ROUTE = 1;
cmdexport const int CMD_DEL_ROUTE = 2;
cmdexport const int CMD_STOP      = 3;

#endif

关于go - 无法从 go 运行 C 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31540974/

相关文章:

go - 获取从 C 到 Golang 的结构体

go - 从 C 调用的 Go 中的整数除法

go - 如何为ARM体系结构构建SO库

windows - 无法在Windows 10上安装gccgo

cryptography - Go 中的加密库与 OpenSSL 相比如何?

pointers - 在 Go 的循环中处理指针结构的正确方法是什么?

python - 在 Go 中枚举常量的最佳方法

go - 调用cgo宏函数

go - 如何将我的自定义 UnmarshalJSON 方法应用于嵌入式结构?

java - Go JNI异常0xc0000005信号在外部代码执行期间到达