首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >go build编译cgo包时找不到我的C标准库

go build编译cgo包时找不到我的C标准库
EN

Stack Overflow用户
提问于 2013-10-04 23:32:09
回答 2查看 5.6K关注 0票数 8

我正试图在一个树莓圆周率中编译一个go项目。

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

当我仅用gcc在raspberry上编译C代码(包括它的调用和所有内容)时,它在没有任何配置的情况下做得很好。

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

但是,当我试图在raspberry pi中用go build编译go项目时,它没有得到我的C库:

代码语言:javascript
复制
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

代码语言:javascript
复制
#include <math.h>
#include <stdint.h>
#include <stdlib.h>
... // definitions of functions used at project.c

project.c

代码语言:javascript
复制
#include <stdlib.h>
#include <string.h>
#include "base64.h"
... // functions used at project.go

第一步:

代码语言:javascript
复制
...

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

我应该在哪里、什么以及如何改变这个声明才能让这个东西起作用?为什么它在我的x86 linux上有效呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-07 01:58:11

我的问题似乎与没有设置CGO_ENABLED标志有关。

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

票数 1
EN

Stack Overflow用户

发布于 2013-10-05 22:27:22

cgo内联语法

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

代码语言:javascript
复制
// #cgo CFLAGS: -I/usr/include

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

-ldflags参数

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

恐怕这个参数在这里帮不了你。应该使用#cgo标记在go源文件中配置所有相关参数。

misc。备注

如果您使用的是math.h,那么您很可能需要链接libmath。您可以通过将此写入go源文件来做到这一点:

代码语言:javascript
复制
// #cgo LDFLAGS: -lm
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19192293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档