I'm trying to compile a go project in a raspberry pi.
The project has 5 files, two small .c
files and its counterparts .h
(one of these files is my code -- it calls the other, which is a base64 library) and a .go
files which calls my .c
code using cgo
.
When I compile my C code only (with its calls and everything) with gcc
alone at the raspberry pi it does well without any configuration.
When I compile the entire go project on my x86
Linux Ubuntu machine with go build
, it also does pretty well.
But when I try to compile the go project with go build
in the raspberry pi it doesn't get my C libraries:
fiatjaf@raspberrypi ~/g/s/b/f/project> go build -x
WORK=/tmp/go-build702187084
mkdir -p $WORK/bitbucket.org/fiatjaf/project/_obj/
cd /home/fiatjaf/go/src/bitbucket.org/fiatjaf/project
/usr/lib/go/pkg/tool/linux_arm/5c -FVw -I $WORK/bitbucket.org/fiatjaf/project/_obj/ -I /usr/lib/go/pkg/linux_arm -o $WORK/bitbucket.org/fiatjaf/project/_obj/base64.5 -DGOOS_linux -DGOARCH_arm ./base64.c
# bitbucket.org/fiatjaf/project
./base64.c:2 5c: No such file or directory: math.h
(If I put the <stdlib.h>
before the <math.h>
the problem occurs for it too, so the problem is not the absence of math.h, I think)
I tried to:
- add
// #cgo CFLAGS: -I/usr/include
to the.go
file - add
// #cgo LDFLAGS: -I/usr/include
(I can't discover what is the proper usage of these flags) - use
go build -ldflags '-I/usr/include'
I don't understand why go is trying to compile base64.c with -I /usr/lib/go/pkg/linux_arm
. Really don't. Someone help.
EDIT: Clarifying note about the structure of the project:
It has 5 files, 2 C (and its counterparts H):
base64.c
#include <math.h>
#include <stdint.h>
#include <stdlib.h>
... // definitions of functions used at project.c
project.c
#include <stdlib.h>
#include <string.h>
#include "base64.h"
... // functions used at project.go
and 1 Go:
...
// #include <stdlib.h>
// #include <string.h>
// #include "project.h"
// #cgo CFLAGS: -I/usr/include
// #cgo LDFLAGS: -lm
import "C"
...
Where, what and how should I change in this declarations for this thing to work? And why did it worked on my x86 linux?