我正试图在一个树莓圆周率中编译一个go项目。
这个项目有5个文件,两个小型.c文件及其对应的.h (其中一个文件是我的代码--它调用另一个文件,这是一个base64库)和一个.go文件,该文件使用cgo调用我的.c代码。
当我仅用gcc在raspberry上编译C代码(包括它的调用和所有内容)时,它在没有任何配置的情况下做得很好。
当我在我的x86 Linux机器上用go build编译整个go项目时,它也做得很好。
但是,当我试图在raspberry pi中用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编译base64.c 64.c。真的不需要谁来帮忙。
编辑:澄清关于项目结构的说明:
它有5个文件,2 C(及其对应方H):
base64.c
#include <math.h>
#include <stdint.h>
#include <stdlib.h>
... // definitions of functions used at project.cproject.c
#include <stdlib.h>
#include <string.h>
#include "base64.h"
... // functions used at project.go第一步:
...
// #include <stdlib.h>
// #include <string.h>
// #include "project.h"
// #cgo CFLAGS: -I/usr/include
// #cgo LDFLAGS: -lm
import "C"
...我应该在哪里、什么以及如何改变这个声明才能让这个东西起作用?为什么它在我的x86 linux上有效呢?
发布于 2013-10-07 01:58:11
我的问题似乎与没有设置CGO_ENABLED标志有关。
我不确定,但似乎是因为我从Raspbian存储库卸载了我的Go (默认情况下它似乎禁用了CGO ),并从源代码中安装了Go (就像我在x86 Linux中做的那样),然后它就开始工作了。
发布于 2013-10-05 22:27:22
cgo内联语法
go文件中cgo参数的正确语法如下:
// #cgo CFLAGS: -I/usr/include没有#和cgo之间的空白。有关语法的详细信息,请参阅cmd/cgo。
-ldflags参数
go -ldflags参数将参数传递给go链接器(5l、6l、8l、.)。即使参数将传递给C链接器,这也不会对您有任何好处,因为链接器不处理包含,编译器也会这样做。
恐怕这个参数在这里帮不了你。应该使用#cgo标记在go源文件中配置所有相关参数。
misc。备注
如果您使用的是math.h,那么您很可能需要链接libmath。您可以通过将此写入go源文件来做到这一点:
// #cgo LDFLAGS: -lmhttps://stackoverflow.com/questions/19192293
复制相似问题