2015-04-13 3 views
0

Новый товар здесь. Пытался позвонить идти функцию из C, но потерпел некоторые компилирование вопросыошибка при вызове go функция c c

Вот идут скрипт

package main 
// #cgo CFLAGS: -Wno-error=implicit-function-declaration 
// #include <stdlib.h> 
// #include "wrapper.c" 
import "C" 
//import "unsafe" 
import "fmt" 
//import "time" 

//export dummy 
func dummy() int { 
    fmt.Println("hi you"); 
    return 0 
} 

func main() { 
    C.testc() 
} 

Вот обертка

#include <sys/types.h> 
#include <stdio.h> 
#include <errno.h> 
#include <string.h> 

extern int dummy(); 

void testc(){ 
    dummy(); 
} 

При запуске его, получил ошибку

[email protected]:~/learn/go$ go run reader.go 
# command-line-arguments 
In file included from $WORK/command-line-arguments/_obj/_cgo_export.c:2:0: 
reader.go:30:14: error: conflicting types for ‘dummy’ 
In file included from reader.go:3:0, 
       from $WORK/command-line-arguments/_obj/_cgo_export.c:2: 
./wrapper.c:6:12: note: previous declaration of ‘dummy’ was here 
/tmp/go-build528677551/command-line-arguments/_obj/_cgo_export.c:8:7: error: conflicting types for ‘dummy’ 
In file included from reader.go:3:0, 
       from $WORK/command-line-arguments/_obj/_cgo_export.c:2: 
./wrapper.c:6:12: note: previous declaration of ‘dummy’ was here 

ответ

1

Вам не нужно объявлять dummy в вашем файле C. Вот как я разделил ваш код, чтобы он работал. Я поместил функцию C, экспортирующую файл .h, и сам объект в файле .c и включил только h-файл в код go.

dummy.h:

void testc(); 

dummy.c:

#include <sys/types.h> 
#include <stdio.h> 
#include <errno.h> 
#include <string.h> 


void testc(){ 
    dummy(); 
} 

main.go:

package main 

// #cgo CFLAGS: -Wno-error=implicit-function-declaration 
// #include <stdlib.h> 
// #include "dummy.h" 
import "C" 

import "fmt" 

//export dummy 
func dummy() int { 
    fmt.Println("hi you") 
    return 0 
} 

func main() { 
    C.testc() 
} 
+0

Спасибо за быстрый ответ. Когда я запустил его, получил ошибку './main.go:33: неопределенная ссылка на' 'testc'' – packetie

+0

@codingFun, как вы ее запускали? Я запускал его с помощью 'go build -o dummy &&./Dummy' –

+0

' go build' вызывает 'cgo' за кулисами, генерируя файлы-обертки и т. Д. И т. Д. Вы можете запускать cgo непосредственно в коде, чтобы увидеть, что он делает. –

Смежные вопросы