2014-10-29 37 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