Westy10101 Westy10101 - 3 months ago 16
C Question

Cannot use already compiled C library using cgo in Golang application?

I am trying to wrap a C library in Golang. I am trying to call a C function in an already compiled library. I have both a

.a
file and a
.so
library file.

Where do I need to place the library files and how do i tell
cgo
that I am using these libraries?

I am rather a novice when it comes to C. Any help would be greatly appreciated.

Amd Amd
Answer

I'll explain it with this sample:

First build libhello.a using ./libs/m.c:

#include <stdint.h> 

extern uint64_t Add(uint64_t a, uint64_t b) {
    return a + b;
}

For this test sample libhello.a is inside ./libs/ :

m.go
└───libs
    m.c
    libhello.a

Then go build this m.go working sample:

package main

//#cgo LDFLAGS: -L${SRCDIR}/libs -lhello
//#include <stdint.h>
//extern uint64_t Add(uint64_t a, uint64_t b);
import "C"

import (
    "fmt"
)

func main() {
    fmt.Println(C.Add(C.uint64_t(10), C.uint64_t(20))) // 30
}

output:

30

When the cgo directives are parsed, any occurrence of the string ${SRCDIR} will be replaced by the absolute path to the directory containing the source file. This allows pre-compiled static libraries to be included in the package directory and linked properly. For example if package foo is in the directory /go/src/foo:

// #cgo LDFLAGS: -L${SRCDIR}/libs -lfoo

Will be expanded to:

// #cgo LDFLAGS: -L/go/src/foo/libs -lfoo
Comments