我正嘗試使用Cgo爲C庫創建綁定。我有使用Cgo導入庫並打電話給它的軟件包。它編譯和安裝很好。但是,當嘗試從Go程序使用該程序包時,鏈接時出現錯誤「意外的R_X86_64_64重新定位動態符號」。「意外的R_X86_64_64重新定位動態符號」使用Cgo時
任何想法?
我正嘗試使用Cgo爲C庫創建綁定。我有使用Cgo導入庫並打電話給它的軟件包。它編譯和安裝很好。但是,當嘗試從Go程序使用該程序包時,鏈接時出現錯誤「意外的R_X86_64_64重新定位動態符號」。「意外的R_X86_64_64重新定位動態符號」使用Cgo時
任何想法?
它出現在6g
編譯assembly generation例程:
case 256 + R_X86_64_64:
if(targ->dynimpname != nil && !targ->dynexport)
diag("unexpected R_X86_64_64 relocation for dynamic symbol %s",
targ->name);
r->type = D_ADDR;
return;
的R_X86_64_64
是一種在庫中的元件的。有關amd64
體系結構中的重定位的更多信息,請參閱頁面70 here。
是否有可能將386
編譯的庫與amd64
代碼混合?
編譯器應報告導致問題的確切符號。你可以嘗試鏈接一個包含其他符號的最小庫,並嘗試找到一個最小的例子,它失敗了嗎?
您是否設法使用cgo
與任何庫?
我與最新的Go版本有完全相同的問題。我在amd64上運行linux,該庫是我自己的,只是編譯它並從其他語言中使用它。我可以在沒有任何問題的情況下將cgo用於其他庫此外,我收到了諸如sym#512的錯誤:忽略了第1節(類型0)中的_ZN8exmpl4doISbIwSt11char_traitsIwESaIwEEED5Ev'。 – 2013-03-24 12:16:55
@snøreven它看起來像一個錯位的C++名稱,你可以用'extern「C」{}'來添加包裝你的函數嗎? – 2013-03-24 18:11:41
我同意Elazar的看法,似乎是混合了32位和64位代碼。
您是否嘗試過gccgo?
就像一個魅力:
[email protected]:/etc# uname -a
Linux Ubuntu-1304-raring-64-minimal 3.8.13.4 #2 SMP Mon Jul 8 23:59:05 CEST 2013 x86_64 x86_64 x86_64 GNU/Linux
做這個順序:
cd /usr/local
mkdir /var/go
apt-get install mercurial
hg clone https://code.google.com/p/go/
之後,創建一個/etc/profile.d/go.sh與follewing內容,並使其可執行:
export GOPATH=/var/go
export GOROOT=/usr/local/go
export GOBIN=$GOPATH/bin
export PATH=$PATH:$GOBIN
export GOROOT_FINAL=/var/go
export GOHOSTARCH=amd64
export GOARCH=amd64
export CGO_ENABLED=1
然後重新啓動你的shell。沒有來源xxx將正常工作 - 被警告!在一個新的外殼做到這一點:
cd /usr/local/go/src
./make.bash
做的事,然後所有的事情從/ usr /本地複製/去到/ var /去 - 或有一種方法來合併由符號鏈接兩個目錄,無論你喜歡。之後,在上面的go.sh腳本中註釋GOROOT_FINAL,然後重新啓動您的shell。你可以使用最新的Go語言!
[email protected]:/usr/work/golang/go/src# go version
go version devel +35d5bae6aac8 Fri Oct 18 10:45:19 2013 +0400 linux/amd64
請注意:兩個shell重啓是必需的 - 需要重新啓動它 - 我自己很難找到它。
您是否找到任何解決方案?我的一個庫遇到了完全相同的錯誤。 – 2013-03-24 12:12:57