doumizhi0809 2013-10-04 23:32
浏览 357
已采纳

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

I'm trying to compile a go project in a raspberry pi.

The project has 5 files, two small .c files and its counterparts .h (one of these files is my code -- it calls the other, which is a base64 library) and a .go files which calls my .c code using cgo.

When I compile my C code only (with its calls and everything) with gcc alone at the raspberry pi it does well without any configuration.

When I compile the entire go project on my x86 Linux Ubuntu machine with go build, it also does pretty well.

But when I try to compile the go project with go build in the raspberry pi it doesn't get my C libraries:

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

(If I put the <stdlib.h> before the <math.h> the problem occurs for it too, so the problem is not the absence of math.h, I think) I tried to:

  • add // #cgo CFLAGS: -I/usr/include to the .go file
  • add // #cgo LDFLAGS: -I/usr/include (I can't discover what is the proper usage of these flags)
  • use go build -ldflags '-I/usr/include'

I don't understand why go is trying to compile base64.c with -I /usr/lib/go/pkg/linux_arm. Really don't. Someone help.

EDIT: Clarifying note about the structure of the project:

It has 5 files, 2 C (and its counterparts 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

and 1 Go:

...

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

Where, what and how should I change in this declarations for this thing to work? And why did it worked on my x86 linux?

  • 写回答

2条回答 默认 最新

  • doufen3838 2013-10-07 01:58
    关注

    It seems my problem was something related to not having set the CGO_ENABLED flag.

    I don't know for sure, but it seems, because I uninstalled my Go from the Raspbian repositories (which seems to come with CGO disabled by default) and installed Go from source (just like I had made in my x86 Linux) then it started to work.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 C# P/Invoke的效率问题
  • ¥20 thinkphp适配人大金仓问题
  • ¥20 Oracle替换.dbf文件后无法连接,如何解决?(相关搜索:数据库|死循环)
  • ¥15 数据库数据成问号了,前台查询正常,数据库查询是?号
  • ¥15 算法使用了tf-idf,用手肘图确定k值确定不了,第四轮廓系数又太小才有0.006088746097507285,如何解决?(相关搜索:数据处理)
  • ¥15 彩灯控制电路,会的加我QQ1482956179
  • ¥200 相机拍直接转存到电脑上 立拍立穿无线局域网传
  • ¥15 (关键词-电路设计)
  • ¥15 如何解决MIPS计算是否溢出
  • ¥15 vue中我代理了iframe,iframe却走的是路由,没有显示该显示的网站,这个该如何处理