【问题标题】:How do you use cgo WITHOUT using make?你如何在不使用 make 的情况下使用 cgo?
【发布时间】:2023-03-21 10:13:01
【问题描述】:

我使用自定义构建工具来编译 go 项目,我需要一种在我的项目中使用 cgo 的方法。

问题是 cgo 文档只告诉你如何使用 make。

我真正需要知道的是使用哪些工具处理哪些生成的文件以及需要以什么顺序完成。我尝试在 go 源目录中读取 make.pkg,但我的最大努力失败了。

我的测试 dll 很简单,一个每次调用都返回 1 的函数,使用这个函数的 go 代码也同样简单。

在 cgo 项目上成功运行 make 所产生的控制台输出将非常有帮助。

【问题讨论】:

    标签: makefile go


    【解决方案1】:

    在目录misc/cgo/life中的32位Linux上运行make的输出:

    # gomake _obj/life.a
    CGOPKGPATH= cgo --  life.go 
    touch _obj/_cgo_run
    8g  -o _go_.8  _obj/life.cgo1.go _obj/_cgo_gotypes.go
    8c -FVw -I ${GOROOT}/pkg/linux_386 -I . -o "_cgo_defun.8" _obj/_cgo_defun.c
    gcc -m32 -I . -g -fPIC -O2 -o _cgo_main.o -c   _obj/_cgo_main.c
    gcc -m32 -g -fPIC -O2 -o c-life.o -c   c-life.c
    gcc -m32 -I . -g -fPIC -O2 -o life.cgo2.o -c   _obj/life.cgo2.c
    gcc -m32 -I . -g -fPIC -O2 -o _cgo_export.o -c   _obj/_cgo_export.c
    gcc -m32 -g -fPIC -O2 -o _cgo1_.o _cgo_main.o c-life.o life.cgo2.o _cgo_export.o  
    cgo -dynimport _cgo1_.o >_obj/_cgo_import.c_ && mv -f _obj/_cgo_import.c_ _obj/_cgo_import.c
    8c -FVw -I . -o "_cgo_import.8" _obj/_cgo_import.c
    rm -f _obj/life.a
    gopack grc _obj/life.a _go_.8  _cgo_defun.8 _cgo_import.8 c-life.o  life.cgo2.o _cgo_export.o
    

    cgo -- life.go 行创建以下文件:

    _obj/_cgo_.o
    _obj/life.cgo1.go
    _obj/life.cgo2.c
    _obj/_cgo_gotypes.go
    _obj/_cgo_defun.c
    _obj/_cgo_main.c
    _obj/_cgo_flags
    _obj/_cgo_export.c
    _cgo_export.h
    

    【讨论】:

      【解决方案2】:

      "我使用自定义构建工具来编译 go 项目,我需要一种在我的项目中使用 cgo 的方法。"

      ...这种方法会导致问题。使用 Makefile 的标准方式简单、容易、经过验证、记录在案等。

      我意识到我没有(直接)回答你的问题。相反,我的“答案”是:我强烈建议使用标准方式。不要通过选择其他不直接支持的选项给自己制造问题。

      也就是说,我认为有一种方法可以避免 Makefile,我只是从未去过那里,抱歉。我通常很懒/没有时间,所以我使用最简单/最快的方式来完成工作。您可能想尝试相同的方法 ;-)

      【讨论】:

      • make 文件对我不起作用。它引用了 Windows 上不可用的各种 unix/linux 特定命令。我尝试修改 make 文件以使其正常工作,但运气不佳。
      • 我想补充一点,在 cgo 项目上运行 make 的控制台输出将是无价的。这至少会给我在逆向工程所需的步骤方面带来巨大的推动作用
      • “Go 1 版本将包含一个新工具 go,它将取代 goinstall 和 make。”来自Go 1 Preview
      猜你喜欢
      • 2021-05-06
      • 2014-08-13
      • 2015-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-05
      • 2021-04-20
      相关资源
      最近更新 更多