go针对不同的共享库构建多个二进制版本

时间:2011-05-26 12:16:56

标签: go

我想创建一个go可执行文件,通过它的本机接口与xen进行通信。为此目的有一个C共享库(实际上是2个),我用cgo创建了一个简单的go包装器。

问题是我想要定位3个版本(3.2,3.4,4.0),每个版本都有不同的共享库。库本身提供了基本相同的API,但C头中定义的结构的大小和形状是不同的,因此相同的编译后的二进制文件不能与这些不同的共享库一起使用。

我想要一个包含'main'的二进制文件和一个go pkg,这是xen的包装器。

我在考虑两种解决方案:

  1. 我可以构建3个不同版本的已编译pkg以及3个不同版本的主二进制文件,每个版本都与相应的pkg版本链接。此解决方案需要手动构建makefile,以便我可以传递正确的路径等

  2. 我可以构建一个瘦C包装器作为共享库,并针对3个版本的xen C绑定构建它3个版本。然后,这个C包装器将导出一个稳定的C接口,然后由一个单独的pkg使用。然后我可以将正确的C包装器共享库部署到主机并在运行时解析它

  3. 还有其他方法可以处理吗?我更喜欢使用纯(c)go代码,但我不喜欢维护复杂的makefile的额外负担。

    编辑:有关为什么我对在makefile中手动处理感到不舒服的更多细节:

    例如,_obj目录的名称在Make.inc和company中是硬编码的,这些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 makefile,因为我无法对包名中的版本进行编码,因为我必须修改源中的导入。

    通过对软件包目录中的版本进行编码,我可以使用GCIMPORTS=-I../../pkg/xen/_obj/$(XENVERSION)从主cmd的Makefile中选择正确的文件。

    当然我可以推出自己的makefile,调用6c和6l,cgo等,但我更喜欢利用现有的make基础设施,因为它似乎有一些智慧。

1 个答案:

答案 0 :(得分:1)

你尝试过这种方法吗?

Architecture- and operating system-specific code

可以很容易地使用$ XENVER环境变量进行调整。