2011-05-26 56 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基础结构,因为它似乎有一些智慧。

回答