【发布时间】:2016-12-12 08:00:08
【问题描述】:
我已经为 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位机器上编译的解决方案。
【问题讨论】:
-
您是否尝试将
$CC替换为$CC_FOR_TARGET?见here。 -
@SiuChingPong-AsukaKenji-使用 make.bash 构建工具链时将使用 $CC_FOR_TARGET。 $CC 用于交叉编译程序。我尝试使用 CC_FOR_TARGET 集重建工具链,但运行 go 工具时出现相同的错误。
-
--sysroot /am335x_toolchain/和CGO_CFLAGS和CGO_LDFLAGS中的类似--sysroot /am335x_toolchain/会有所帮助吗? -
@RomanKhimov 我在
CGO_CFLAGS和CGO_LDFLAGS中都添加了--sysroot /am335x_toolchain/,它起作用了。谢谢您的帮助。如果你写了一个答案,我会把它标记为正确的。