V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
mckelvin
V2EX  ›  问与答

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

  •  
  •   mckelvin · 2015-10-16 14:44:05 +08:00 · 2989 次点击
    这是一个创建于 3107 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5181 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 01:22 · PVG 09:22 · LAX 18:22 · JFK 21:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.