http://github.com/douban/libmc 是一个 C++ 和 Python 实现的 memcached 客户端,最近尝试在 C++ 部分基础上封装下做成 Golang 客户端。
理想的情况下的代码组织是把 golang 代码放到单独的一个目录:
.
├── golibmc
│ └── golibmc.go
├── include
│ ├── hashkit
│ │ └── crc32.h
│ └── libmc.h
└── src
├── hashkit
│ └── crc32.c
└── libmc.c
然而 Golang 与 C 交互的工具只认当前.go 文件目录下(甚至不包含子目录)的 *.c , *.cpp
文件,于是不得不把所有子目录下的 C/C++ 文件全放到一个目录,并且把 golang 代码和 C/C++代码也放一块儿。
.
├── golibmc -> src
├── include
│ ├── hashkit
│ │ └── crc32.h
│ └── libmc.h
└── src
├── golibmc.go
├── hashkit
├── hashkit_crc32.c
└── libmc.c
感觉这么做感觉太恶心了。
还有种可能的解决方法是把 C/C++部分做成系统包,安装到 /usr/lib/libmc.a
之类的地方,然后 Golang 构建的时候 -l mc
, 这样做的缺点是安装这个包无法一步完成,而且还依赖全局安装,不全局安装得配环境变量,对使用者而言非常麻烦。大家有更好的办法吗?
向官方提议新增一个输入参数 #cgo SOURCE_FILES
方便指定要编译的 C/C++文件,然而官方并不支持的样子: https://github.com/golang/go/issues/12953