I'm trying to call a Go function from a C program. I have built a static library from my Go source, however, ld is unable to find the function I want to call from the C program.
Go code:
package main
import "fmt"
import "C"
// (this can be called anything)
// export goCallbackHandler
func goCallbackHandler() C.int {
i := Hello()
return C.int(i)
}
func Hello() int {
fmt.Println("Hello, world!")
return 0
}
func main() {
}
C code: (main.c)
#include "binding.h"
int main() {
// Call the function from the binding
return goCallbackHandler();
}
(binding.h)
extern int goCallbackHandler();
I can build the library successfully with go build -o libhello.a -buildmode=c-archive hello.go
. However, when I then try to build the C part with gcc -o hello main.c -L. -lhello
I get the error
main.c:(.text+0xe): undefined reference to `goCallbackHandler'
collect2: error: ld returned 1 exit status
from ld
Whitespace matters: the export comment needs to be //export
, not // export
. Your version doesn't actually export anything. With the export comment fixed to be //export goCallbackHandler
, it works as expected.