2011-05-26 37 views
1

我想創建一個go可執行文件,它通過它的本地接口與xen進行通信。有一個C共享庫(實際上是2)用於這個目的,我用cgo創建了一個簡單的包裝器。go針對不同的共享庫構建多個二進制版本

問題是我想要定位3個xen版本(3.2,3.4,4.0),每個版本都有不同的共享庫。該庫本身提供了基本相同的API,但C頭中定義的結構體的大小和形狀不同,因此相同的編譯過的二進制文件不能與這些不同的共享庫一起使用。

我想要一個去二進制保存'主'和一個去pkg這是包裝的xen。

我想約2解決方案:

  1. 我可以建立編譯PKG的3個不同的版本,也3不同版本的主要二進制的每一個與相應的PKG版本鏈接。此解決方案需要手動構建makefile以便我可以傳遞正確的路徑等

  2. 我可以構建一個瘦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基礎結構,因爲它似乎有一些智慧。

回答

相關問題