8

我正在尝试在树莓派中编译一个 go 项目。

该项目有 5 个文件,两个小.c文件及其对应文件(其中一个文件是我的代码 - 它调用.h另一个,它是一个 base64 库)和一个使用..go.ccgo

当我只在树莓派上编译我的 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 上运行?

4

2 回答 2

3

cgo 内联语法

go 文件中 cgo 参数的正确语法是这样的:

// #cgo CFLAGS: -I/usr/include

#和之间没有空格cgo。有关语法的详细信息,请参阅cmd/cgo

-ldflags 参数

go-ldflags参数将参数传递给 go 链接器 (5l, 6l, 8l, ...)。即使将参数传递给 C 链接器,这也对您没有任何好处,因为链接器不处理包含,编译器会处理。

恐怕这个参数在这里对你没有帮助。所有相关参数都应该在 go 源文件中使用#cgo标签进行配置。

杂项 笔记

如果您正在使用math.h,您很可能需要链接 libmath。您可以通过将其写入您的 go 源文件来执行此操作:

// #cgo LDFLAGS: -lm
于 2013-10-05T22:27:22.133 回答
1

看来我的问题与没有设置CGO_ENABLED标志有关。

我不确定,但似乎是因为我从 Raspbian 存储库中卸载了我的 Go(默认情况下似乎禁用了 CGO)并从源代码安装了 Go(就像我在 x86 Linux 中所做的那样)然后它开始工作。

于 2013-10-07T01:58:11.307 回答