2015-07-21 65 views
3

我想從go語言代碼運行C調用。這裏是我運行的程序:無法從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; 

現在,這裏是試圖運行該程序時,我收到錯誤:

[email protected]:~$ go run test.go 
# command-line-arguments 
could not determine kind of name for C.CMD_SET_ROUTE 

我正在使用gccgo-5並轉到版本1.4.2。你能幫我弄清楚這到底是什麼問題嗎? TIA。

+0

我將避免試圖用gccgo *和* go1.4.2。堅持使用默認工具鏈,直到您對gccgo有特定需求,以避免增加混淆。 – JimB

+3

代碼中有很多語法錯誤。如果你在使用cgo之前瀏覽[this](http://blog.golang.org/c-go-cgo)博客帖子會更好。 –

回答

6

四件事情:

  • 你應該包括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