2016-04-30 2554 views
1

我正在構建使用CGo的代碼,此代碼必須被編譯爲共享或靜態庫(靜態是高度優選的)。 (code for reference轉到代碼編譯鏈接器錯誤。我可以手動鏈接嗎?

它在Linux和Mac上都可以正常工作,但是在Windows上它在鏈接器階段失敗,或者說所有4種模式(c-shared,shared,c-archive,archive)都不可用或者調用go tool link -shared手動抱怨缺少窗口的具體說明。

我的理解是,我需要建立可用lib.a是編譯的一切,我會使用到的目標文件(*的.o),然後把它通過ar才能產生有效的靜態庫。

現在的問題是我是否可以完全跳過Go的鏈接器,並基於準備好的.o文件手動創建.a

如果甚至有可能,我該如何去做?

+0

你在哪裏得到這些「準備好的'.o'文件」以構建成靜態庫?有關Windows問題的詳細信息,請參閱https://github.com/golang/go/issues/11058。 – JimB

+0

@JimB當調用cgo時,.o文件來自Go本身。你可以用'-x'參數運行一個示例代碼,這樣它就會向你展示它正在做的所有事情,然後通過調用'go tool [tool] [arguments]''並調用' gcc [arguments]'因爲這是用CGo代碼去做的。 – AlexKey

+0

@JimB另外,如果你看看你鏈接的問題仍然存在,意味着它沒有解決。但是,當我在自己的答案中編寫代碼時,我不得不構建Go代碼的最新主分支,以便能夠成功編譯所有內容。 – AlexKey

回答

0

看起來像windows上的gcc無法自動發現必要的共享庫。問題是由GCC造成的,而不是由Go造成的。

雖然編譯轉到我不得不用自編主舌尖當前版本(1.6.2)不支持共享的Windows/AMD64 /靜態庫。

在默認位置(C:\ Windows \ SysWOW64)手動爲每個共享庫(ntdll,winmm等)提供gcc已解決該問題。