无法从go运行C调用

时间:2015-07-21 13:48:32

标签: 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并使用版本1.4.2。你能帮我解决一下究竟是什么问题吗? TIA。

1 个答案:

答案 0 :(得分:6)

四件事:

  • 在包含proxy.h时,您应该使用双引号,因为它与您的.go文件位于同一目录中。
  • 在“C”注释和“C”导入之前,不能有空行。
  • 您最后错过#endif proxy.h
  • 在包含CMD_DEFINE之前,您需要定义proxy.h。否则,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