我想创建一个go可执行文件,通过它的本机接口与xen进行通信。为此目的有一个C共享库(实际上是2个),我用cgo创建了一个简单的go包装器。
问题是我想要定位3个版本(3.2,3.4,4.0),每个版本都有不同的共享库。库本身提供了基本相同的API,但C头中定义的结构的大小和形状是不同的,因此相同的编译后的二进制文件不能与这些不同的共享库一起使用。
我想要一个包含'main'的二进制文件和一个go pkg,这是xen的包装器。
我在考虑两种解决方案:
我可以构建3个不同版本的已编译pkg以及3个不同版本的主二进制文件,每个版本都与相应的pkg版本链接。此解决方案需要手动构建makefile,以便我可以传递正确的路径等
我可以构建一个瘦C包装器作为共享库,并针对3个版本的xen C绑定构建它3个版本。然后,这个C包装器将导出一个稳定的C接口,然后由一个单独的pkg使用。然后我可以将正确的C包装器共享库部署到主机并在运行时解析它
还有其他方法可以处理吗?我更喜欢使用纯(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基础设施,因为它似乎有一些智慧。
答案 0 :(得分:1)