我想創建一個go可執行文件,它通過它的本地接口與xen進行通信。有一個C共享庫(實際上是2)用於這個目的,我用cgo創建了一個簡單的包裝器。go針對不同的共享庫構建多個二進制版本
問題是我想要定位3個xen版本(3.2,3.4,4.0),每個版本都有不同的共享庫。該庫本身提供了基本相同的API,但C頭中定義的結構體的大小和形狀不同,因此相同的編譯過的二進制文件不能與這些不同的共享庫一起使用。
我想要一個去二進制保存'主'和一個去pkg這是包裝的xen。
我想約2解決方案:
我可以建立編譯PKG的3個不同的版本,也3不同版本的主要二進制的每一個與相應的PKG版本鏈接。此解決方案需要手動構建makefile以便我可以傳遞正確的路徑等
我可以構建一個瘦C封裝器作爲共享庫,並在3個版本中針對xen C綁定的3個版本構建它。這個C包裝器然後會導出一個穩定的C接口,然後由一個go pkg使用。然後,我可以將正確的C封裝共享庫部署到主機,並在運行時解決它
是否有任何其他方式來處理?我寧願使用純粹的(c)代碼,但我不喜歡維護複雜的makefile的額外負擔。
編輯:爲什麼我感到不舒服手動處理,在生成文件的更多細節:
例如,_obj目錄的名稱是硬編碼在Make.inc和公司,並且這些makefile依靠一些產生。包含有關共享庫名稱的特殊信息的c文件,在構建pkg的下一個版本之前必須先清除它們。我的makefile文件的文檔片斷:
all:
rm -f _obj/_*
$(MAKE) -f Makefile.common XENVERSION=3.0
rm -f _obj/_*
$(MAKE) -f Makefile.common XENVERSION=3.4
rm -f _obj/_*
$(MAKE) -f Makefile.common XENVERSION=4.0
其中Makefile.common基本上是使用TARG=$(XENVERSION)/vimini/xen
,因爲我不能編碼包名的版本,因爲我不得不修改源進口正常PKG生成文件。
通過對軟件包目錄中的版本進行編碼,我可以使用GCIMPORTS=-I../../pkg/xen/_obj/$(XENVERSION)
從主cmd的Makefile中選擇正確的une。
當然,我可以推出自己的makefile,它調用6c和6l,cgo等,但我更喜歡利用現有的make基礎結構,因爲它似乎有一些智慧。
是的,我使用了類似的方法,問題是我必須維護我自己的makefile並執行其他一些技巧。 – ithkuil 2011-05-26 13:21:05