2016-08-05 6 views
1

私は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ビットマシンでコンパイルの解決策が見つかりませんでした。

+0

'$ CC'を' $ CC_FOR_TARGET'に置き換えてみましたか? [here](https://golang.org/cmd/cgo/)を参照してください。 –

+0

@ SiuChingPong-AsukaKenji- $ CC_FOR_TARGETは、make.bashを使用してツールチェーンを構築するときに使用されます。 $ CCは、プログラムのクロスコンパイルに使用されます。 CC_FOR_TARGETを設定してツールチェーンを再構築しようとしましたが、goツールを実行するときに同じエラーが発生します。 – dangeroushobo

+0

'--sysroot/am335x_toolchain /'のようなものが 'CGO_CFLAGS'と' CGO_LDFLAGS'の両方に役立つでしょうか? –

答えて

3

クロスコンパイラがヘッダーとライブラリを正しく検索するには、がCGO_CFLAGSとCGO_LDFLAGSの両方に追加されている場合は、--sysroot optionが必要です。

関連する問題