Golang(cgo) 封装 C/C++ 代码的情况,大家是如何组织代码文件的

2015-10-16 14:44:05 +08:00
 mckelvin
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
2989 次点击
所在节点    问与答
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/228546

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX