cgo交叉编译无法找到库

时间:2016-08-05 20:09:08

标签: linux go cgo

我已经编写了一个关于linux中信号量函数的包装器。这在过去的Go 1.3和Go 1.4中对我有用,但我需要使用这个包装器重建我的应用程序,它不再使用Go 1.6.2或Go 1.7rc5构建。

我写了一个产生相同错误的简单测试应用程序:

package main

import (
    "fmt"
    "os"
    "linux/semaphore"
)

func main() {
    var sema semaphore.Semaphore
    if err := sema.Open("/test", 0644, 1); err != nil {
        fmt.Printf("%v\n", err)
        os.Exit(1)
    }
    if err := sema.TryWait(); err != nil {
        fmt.Printf("%v\n", err)
        os.Exit(1)
    }
    if err := sema.Post(); err != nil {
        fmt.Printf("%v\n", err)
        os.Exit(1)
    }
}

现在程序本身就编译了(linux / amd64),我的问题是当我尝试交叉编译linux / arm(Ti am3352)时。

以前我所要做的就是:

GOOS=linux GOARCH=arm GOARM=7 CGO_ENABLED=1 CC=/am335x_toolchain/bin/armv7l-timesys-linux-gnueabi-gcc go build

现在出现以下错误:

# runtime/cgo
/tmp/go-build820923984/runtime/cgo/_obj/_cgo_export.c:2:20: fatal error: stdlib.h: No such file or directory
 #include <stdlib.h>
                    ^
compilation terminated.

所以我指定了包含路径:

GOOS=linux GOARCH=arm GOARM=7 CGO_ENABLED=1 CC=/am335x_toolchain/bin/armv7l-timesys-linux-gnueabi-gcc CGO_CFLAGS="-I/am335x_toolchain/include" go build
# runtime/cgo
/am335x_toolchain/bin/../lib/gcc/armv7l-timesys-linux-gnueabi/4.8.3/../../../../armv7l-timesys-linux-gnueabi/bin/ld: cannot find Scrt1.o: No such file or directory
/am335x_toolchain/bin/../lib/gcc/armv7l-timesys-linux-gnueabi/4.8.3/../../../../armv7l-timesys-linux-gnueabi/bin/ld: cannot find crti.o: No such file or directory
/am335x_toolchain/bin/../lib/gcc/armv7l-timesys-linux-gnueabi/4.8.3/../../../../armv7l-timesys-linux-gnueabi/bin/ld: cannot find -lpthread
collect2: error: ld returned 1 exit status

最终我得到了这个,但仍然不起作用:

GOOS=linux GOARCH=arm GOARM=7 CGO_ENABLED=1 CC=/am335x_toolchain/bin/armv7l-timesys-linux-gnueabi-gcc CGO_LDFLAGS="-L/am335x_toolchain/lib -pthread" CGO_CFLAGS="-I/am335x_toolchain/include" go build
# runtime/cgo
/am335x_toolchain/bin/../lib/gcc/armv7l-timesys-linux-gnueabi/4.8.3/../../../../armv7l-timesys-linux-gnueabi/bin/ld: cannot find Scrt1.o: No such file or directory
/am335x_toolchain/bin/../lib/gcc/armv7l-timesys-linux-gnueabi/4.8.3/../../../../armv7l-timesys-linux-gnueabi/bin/ld: cannot find crti.o: No such file or directory
/am335x_toolchain/bin/../lib/gcc/armv7l-timesys-linux-gnueabi/4.8.3/../../../../armv7l-timesys-linux-gnueabi/bin/ld: cannot find /lib/libpthread.so.0
/am335x_toolchain/bin/../lib/gcc/armv7l-timesys-linux-gnueabi/4.8.3/../../../../armv7l-timesys-linux-gnueabi/bin/ld: cannot find /usr/lib/libpthread_nonshared.a
collect2: error: ld returned 1 exit status

pthread库确实存在:

$ ls /am335x_toolchain/lib | grep "libpthread*"
libpthread-2.18.so
libpthread.a
libpthread_nonshared.a
libpthread.so
libpthread.so.0

有关使用CGO进行交叉编译需要做什么的任何指示?似乎与每个版本一样,我在使用CGO进行交叉编译时遇到了更多麻烦。

修改

我发现这是主机架构的问题。在x86_64机器(linux)上运行时,我遇到了上述问题。当我在32位x86机器(linux)上使用Go 1.6编译时,它构建没有错误。还没有找到在64位机器上编译的解决方案。

1 个答案:

答案 0 :(得分:6)

所以问题是交叉编译器要正确找到它的头文件和库需要--sysroot option,在你的情况下--sysroot /am335x_toolchain/添加到CGO_CFLAGS和CGO_LDFLAGS。