2015-02-18 2 views
1

Я хотел бы назвать функцию go fun из функционального пространства C, но программа выдает ошибку сборки.cgo: Неопределенные символы для архитектуры x86_64

example.go

package main 

/* 
#include "test.c" 
*/ 
import "C" 
import "fmt" 

func Example() { 
    fmt.Println("this is go") 
    fmt.Println(C.GoString(C.myprint(C.CString("go!!")))) 
} 

// export receiveC    (remove the extra space between // and export) 
func receiveC(msg *C.char) { 
    fmt.Println(C.GoString(msg)) 
} 

func main() { 
    Example() 
} 

test.c

#include <stdio.h> 

extern void receiveC(char *msg); 

char* myprint(char *msg) { 
    receiveC(msg); // calling the exported go function 
    return msg;  
    } 

Когда я выполнить команду для запуска/сборки (go build или go run example.go или go build example.go) программу, он выдает ошибку:

# github.com/subh007/goodl/cgo 
Undefined symbols for architecture x86_64: 
    "_receiveC", referenced from: 
     _myprint in example.cgo2.o 
     __cgo_6037ec60b2ba_Cfunc_myprint in example.cgo2.o 
     _myprint in test.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

Я следую за cgo slides для написания программы. Пожалуйста, дайте мне знать о каких-либо ошибках здесь.

Редактировать 1: Я использую OS-X 10.9 OS.

Edit2: У меня есть одно дополнительное пространство между // export, не должно быть никакого пространства между // и export. Но теперь я получаю следующее сообщение об ошибке во время строительства:

# github.com/subh007/goodl/cgo 
duplicate symbol _myprint in: 
    $WORK/github.com/subh007/goodl/cgo/_obj/_cgo_export.o 
    $WORK/github.com/subh007/goodl/cgo/_obj/example.cgo2.o 
duplicate symbol _receiver_go in: 
    $WORK/github.com/subh007/goodl/cgo/_obj/_cgo_export.o 
    $WORK/github.com/subh007/goodl/cgo/_obj/example.cgo2.o 
duplicate symbol _myprint in: 
    $WORK/github.com/subh007/goodl/cgo/_obj/_cgo_export.o 
    $WORK/github.com/subh007/goodl/cgo/_obj/test.o 
duplicate symbol _receiver_go in: 
    $WORK/github.com/subh007/goodl/cgo/_obj/_cgo_export.o 
    $WORK/github.com/subh007/goodl/cgo/_obj/test.o 
ld: 4 duplicate symbols for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

ответ

3

Повторяющиеся символы генерируются, потому что я включил в test.c непосредственно к файлу идут. Поэтому символы включены дважды.

Я думаю, правильный способ написания этого кода является (пожалуйста, прокомментируйте, если я ошибаюсь), чтобы:

  1. Определение заголовка файла (test.h):

    #ifndef TEST_H_ 
    #define TEST_H_ 
    
    char* myprint(char *msg); 
    
    #endif 
    
  2. Определить файл реализации (test.c):

    #include <stdio.h> 
    #include "test.h" 
    
    extern void receiveC(char *msg); 
    
    char* myprint(char *msg) { 
        receiveC(msg); 
        return msg; 
        } 
    
  3. Включить в .h файл т о файле go (example.go): пакета главного

    /* 
    #include "test.h" 
    */ 
    import "C" 
    import "fmt" 
    
    func Example() { 
         fmt.Println("this is go") 
         fmt.Println(C.GoString(C.myprint(C.CString("go!!")))) 
        } 
    
        // make sure that there should be no space between the `//` and `export` 
        //export receiveC 
        func receiveC(msg *C.char) { 
         fmt.Println(C.GoString(msg)) 
        } 
    
        func main() { 
         Example() 
        } 
    
  4. Построить программу:

    go build 
    
  5. запустить сгенерированный исполняемый файл (исполняемый файл генерацию с именем cgo, необходимо некоторое исследование найти причину).

    $./cgo 
    
+0

Или еще проще: https://github.com/golang/go/wiki/cgo#global-functions. Слайды, на которые вы ссылаетесь, очень старые и больше не применимы. – JimB

+0

thaks @JimB, это очень полезная ссылка. –

+0

Получите еще одну проблему с этим образцом: ** Неопределенные символы для архитектуры x86_64: «_myprint», на которые ссылаются: ... **. Не понимаю, почему я получаю эту ошибку, кажется, что все включено нормально. – zgcharley