我正在尝试在树莓派中编译一个 go 项目。
该项目有 5 个文件,两个小.c
文件及其对应文件(其中一个文件是我的代码 - 它调用.h
另一个,它是一个 base64 库)和一个使用..go
.c
cgo
当我只在树莓派上编译我的 C 代码(及其调用和所有内容)时gcc
,它在没有任何配置的情况下运行良好。
x86
当我在我的Linux Ubuntu 机器上编译整个 go 项目时go build
,它也做得很好。
但是当我尝试go build
在树莓派中编译 go 项目时,它没有得到我的 C 库:
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
(如果我把它放在问题发生<stdlib.h>
之前<math.h>
,那么问题不在于没有 math.h,我认为)我试图:
- 添加
// #cgo CFLAGS: -I/usr/include
到.go
文件中 - 添加
// #cgo LDFLAGS: -I/usr/include
(我无法发现这些标志的正确用法是什么) - 采用
go build -ldflags '-I/usr/include'
我不明白为什么 go 试图用-I /usr/lib/go/pkg/linux_arm
. 真的不要。有人帮忙。
编辑:关于项目结构的澄清说明:
它有 5 个文件,2 个 C(及其对应的 H):
base64.c
#include <math.h>
#include <stdint.h>
#include <stdlib.h>
... // definitions of functions used at project.c
项目.c
#include <stdlib.h>
#include <string.h>
#include "base64.h"
... // functions used at project.go
和 1 去:
...
// #include <stdlib.h>
// #include <string.h>
// #include "project.h"
// #cgo CFLAGS: -I/usr/include
// #cgo LDFLAGS: -lm
import "C"
...
我应该在哪里,什么以及如何改变这个声明才能让这个东西起作用?为什么它可以在我的 x86 linux 上运行?