编译cgo包时,go build没有找到我的C标准库

前端之家收集整理的这篇文章主要介绍了编译cgo包时,go build没有找到我的C标准库前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试在树莓派中编译一个go项目.

该项目有5个文件,两个小.c文件和其对应的.h(这些文件中的一个是我的代码 – 它会调用其他,这是一个base64库)和一个.去文件,其中要求使用CGO我.C代码.

当我在raspberry pi中仅使用gcc编译我的C代码(使用其调用和所有内容)时,它没有任何配置.

当我使用go build在我的x86 Linux Ubuntu机器上编译整个go项目时,它也做得很好.

但是当我尝试使用覆盆子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>的&lt之前它出现问题了,所以这个问题是不是不存在math.h中,我想)
我试过了:

>添加// #cgo CFLAGS:-I /usr/include到.go文件
> add // #cgo LDFLAGS:-I /usr/include(我无法发现这些标志的正确用法)
>使用go build -ldflags’-I /usr/include’

我不明白为什么要试图编译-I /usr/lib中/去/包装/ linux_arm base64.c.真的没有.有人帮忙.

编辑:澄清关于项目结构的说明:

它有5个文件,2个C(及其对应的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

和1去:

...

// #include <stdlib.h>
// #include <string.h>
// #include "project.h"
// #cgo CFLAGS: -I/usr/include
// #cgo LDFLAGS: -lm
import "C"
...

在这个声明中,我应该在哪里,什么以及如何改变这个东西?为什么它在我的x86 linux上运行?

解决方法

cgo内联语法

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

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

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

-ldflags参数

go -ldflags参数将参数传递给go连接器(5l,6l,8l,…).
即使参数将传递给C链接器,这对您没有任何好处
由于链接器不处理包含,编译器会这样做.

我担心这个参数对你不起作用.所有相关参数都应该
使用#cgo标签在go源文件中配置.

杂项.笔记

如果你正在使用math.h,你很可能需要链接libmath.你可以这样做
将此文件写入您的go源文件

// #cgo LDFLAGS: -lm

猜你在找的C&C++相关文章