cgo : Undefined symbols for architecture x86_64

cgo, go, linker

Solution

Duplicate symbols are generated because I have included the `test.c` directly to the go file. So the symbols are included twice.

I think, the correct way of writing this code is (please comment if I am wrong) to:

Define the header file (test.h):

 #ifndef TEST_H_
 #define TEST_H_

 char* myprint(char *msg);

 #endif

Define the implementation file (test.c):

  #include <stdio.h>
  #include "test.h"

  extern void receiveC(char *msg);

  char* myprint(char *msg) {
      receiveC(msg);
      return msg;
   }

Include the `.h` file to the `go` file (example.go) :

  package main
  /*
  #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()
   }

Build the program :

  go build

run the generated executable (the executable file generate with the `cgo` name, need some investigation to find the reason).

  $./cgo

Problem

I would like to call the go func from the C function space, but the program throws the build error. 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; } ``` When I execute the command to run/build (`go build` or `go run example.go` or `go build example.go`) the program, it throws the error: ``` # 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) ``` I am following the cgo slides to writing the program. Please let me know for any mistakes here. Edit1: I am using OS-X 10.9 OS. Edit2: I have one extra space between `// export`, there should be no space between `//` and `export`. But now I am getting the following error while building : ``` # 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) ```

Original source