2014-10-29 91 views
2

我有一些专门为mips构建的源代码。我试图让它们在x86上编译,以便在x86上运行精选的,非体系结构特定的代码。我的来源组织如下:有条件地构建x86和mips的源代码

ipmi.go:#只建立在mips上。

package main 

import (
    "foo" 
    "bar" 
) 

/* 
#cgo LDFLAGS: -lfreeipmi 
#define FOO 1 
some c code 
*/ 

import C 
// go code 
func gofunc1() { 
} 

func gofunc2() { 
} 
// more go code 

hardware.go:#所有去向代码

package main 
import (
     "lots" 
      "of" 
      "libs" 
     ) 

func main() { 
    // some go code 
    ret1 = gofunc1() 
    ret2 = gofunc1() 

    // Use ret1 and ret2 to do something else. 
    // more go code 
} 

什么是保证建筑物在x86这些资源的最佳方式?

我增加了以下内容ipmi.go限制在其上建造的牌坊:

// +build linux,mips,cgo 

hardware.go仍然无法编译,因为它调用gofunc1()gofunc2()。由于hardware.go将始终需要拨打gofunc1()gofunc2(),我不能认为 有条件地编译这些x86源代码。任何inisghts将有所帮助。

感谢

回答

4

Package build

建立约束

一次构建约束,也被称为构建标签,是一个行注释是 开始

// +build 

那列出co该文件应包含在 包中。约束可能出现在任何类型的源文件中(不仅仅是 Go),但它们必须出现在文件的顶部附近,其前面只有 空行和其他行注释。这些规则意味着在Go文件 中,构建约束必须出现在package子句之前。

要区分构建约束和包文档,构建约束的系列 必须后跟一个空行。

要使用CGO只有当建立一个文件,只有在Linux和OS X:

// +build linux,cgo darwin,cgo 

这样的文件通常是与实施其他系统的 默认功能,另一个文件配对,在这种情况下,将 进行约束:

// +build !linux,!darwin !cgo 

按照文件中的建议。例如,

hardware.go

package main 

import "fmt" 

func main() { 
    fmt.Println(ipmi()) 
} 

ipmi.go

// +build linux,mips,cgo 

package main 

func ipmi() string { return "mips" } 

ipmi_not.go

// +build !linux !mips !cgo 

package main 

func ipmi() string { panic("not implemented") } 
+0

非常感谢您! – linuxfan 2014-10-29 12:30:58