【问题标题】:Assembler used by golang when building with and without cgo使用和不使用 cgo 构建时 golang 使用的汇编程序
【发布时间】:2016-02-23 20:22:46
【问题描述】:

假设我有一个 golang 包,其中包含一些汇编代码:

 demopkg/
   source1.go
   source2.go
   asm_amd64.s

如果我尝试使用go build 构建它,工具链将使用go tool asm 组装*.s 文件。

但如果我将 Cgo 添加到混合物中,通过将单个 import "C" 放入任何源中,go 将切换到 gcc 汇编器。

我可以通过执行go build -n 看到它。从第一个案例中对/usr/local/go/pkg/tool/linux_amd64/asm 的调用被对gcc 的调用所取代。除此之外,它还开始抱怨语法错误。

是否记录了这种行为,以便我可以依靠它来维护我的包?我可以强制go build 使用一个精确的汇编器吗?

【问题讨论】:

    标签: gcc assembly go package cgo


    【解决方案1】:

    是的,在cgo documentation

    当 Go 工具看到一个或多个 Go 文件使用特殊导入时 "C",它会在目录中寻找其他非Go文件并编译 它们作为 Go 包的一部分。任何 .c、.s 或 .S 文件都将 用 C 编译器编译。任何 .cc、.cpp 或 .cxx 文件都将 用 C++ 编译器编译。任何 .h、.hh、.hpp 或 .hxx 文件都将 不单独编译,但是,如果这些头文件改变了, C 和 C++ 文件将被重新编译。默认的 C 和 C++ 编译器可能会被 CC 和 CXX 环境变量改变, 分别;这些环境变量可能包括命令行 选项。

    【讨论】:

    • 哦,哇,我看过这个页面十几次了,但我从来没有注意到关于 .s 文件的部分。我想避免此功能的唯一方法是拆分包...
    猜你喜欢
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    • 2016-10-27
    相关资源
    最近更新 更多