Hello-World CGO program

I’m sharing my first CGO program, I hope it helps.

File structure:

$ tree
├── hello.c
├── hello.h
└── main.go


#include <stdio.h>

#include "hello.h"

void Greet() {
    printf("Hello, world!\n");



void Greet();



package main

// #include "hello.h"
import "C"

import (

func main() {
	if err := greet(); err != nil {
		log.Fatalf("Failed to call hello: %s", err)
	log.Printf("Successfully called hello!\n");

func greet() error {
	_, err := C.Greet()
	if err != nil {
		return fmt.Errorf("call to hello failed: %s", err)
	return nil

Build & run

$ go build -o main
$ ./main
Hello, world!
2021/04/26 14:30:39 Successfully called hello!


I followed Cgo: First steps tutorial, but the examples provided didn’t compile for me (see error down below), I had to create a header file (hello.h) and a source file (hello.c), as shown in this post.

/tmp/go-build070036073/b001/_x003.o: In function `printf':
/usr/include/x86_64-linux-gnu/bits/stdio2.h:104: multiple definition of `Greet'
/tmp/go-build070036073/b001/_x002.o:/usr/include/x86_64-linux-gnu/bits/stdio2.h:104: first defined here
collect2: error: ld returned 1 exit status

Update: Just realized that the tutorial referenced above explains how to fix the error. Anyway, now we have two slightly different ways to write a hello-world CGO program.

This entry was posted in Posts, SoftwareEngineering. Bookmark the permalink.