私はlinuxのセマフォ関数のラッパーを作成しました。これは過去にGo 1.3とGo 1.4で私の仕事をしていましたが、私はこのラッパーを使ってアプリケーションを再構築する必要があり、もはやGo 1.6.2やGo 1.7rc5でビルドしません。cgoクロスコンパイルでライブラリが見つかりません
私は同じエラーを生成し、簡単なテストアプリケーションを書いた:私は、Linux/ARM用のクロスコンパイルしようとすると
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)をコンパイルしない、私の問題は(ありますTi am3352)。
以前私がしなければならなかったすべてだった:
# 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 go build
これにはまだ動作しません:
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ライブラリが存在しない:私はCGOと交差コンパイルする何をする必要があるかについて
$ ls /am335x_toolchain/lib | grep "libpthread*"
libpthread-2.18.so
libpthread.a
libpthread_nonshared.a
libpthread.so
libpthread.so.0
任意のポインタを?私はCGOでクロスコンパイルするのに苦労しました。
EDIT:
が、これはホストアーキテクチャの問題である私を発見しました。私は上記の問題をx86_64マシン(linux)で実行しています。私が32ビットx86マシン(Linux)でGo 1.6をコンパイルすると、エラーなしでビルドされます。まだ64ビットマシンでコンパイルの解決策が見つかりませんでした。
'$ CC'を' $ CC_FOR_TARGET'に置き換えてみましたか? [here](https://golang.org/cmd/cgo/)を参照してください。 –
@ SiuChingPong-AsukaKenji- $ CC_FOR_TARGETは、make.bashを使用してツールチェーンを構築するときに使用されます。 $ CCは、プログラムのクロスコンパイルに使用されます。 CC_FOR_TARGETを設定してツールチェーンを再構築しようとしましたが、goツールを実行するときに同じエラーが発生します。 – dangeroushobo
'--sysroot/am335x_toolchain /'のようなものが 'CGO_CFLAGS'と' CGO_LDFLAGS'の両方に役立つでしょうか? –