2015-07-21 2 views
3

Я пытаюсь запустить вызов C из кода go go. Вот программа, которую я бегу:Невозможно выполнить вызов C из go

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. Не могли бы вы помочь мне выяснить, что именно здесь происходит? ТИА.

+0

Я хотел бы избежать, пытаясь использовать gccgo * и * go1.4.2. Придерживайтесь инструментальной привязки по умолчанию, пока у вас не возникнет особая потребность в gccgo, чтобы избежать путаницы. – JimB

+3

В коде есть много синтаксических ошибок. Было бы лучше, если вы пройдете через [это] (http://blog.golang.org/c-go-cgo) сообщение в блоге перед использованием cgo. –

ответ

6

Четыре вещи:

  • Вы должны использовать двойные кавычки при включении proxy.h, так как она находится в том же каталоге, что и файл .go.
  • Перед вами комментарий «C» и «C» не может быть пустой строки.
  • Вам не хватает #endif в конце proxy.h.
  • Перед тем, как включить 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