<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                [TOC] ## 概述 - 可通過 `go/官方包/plugin` 路徑查看對比查看 ## 命令 ``` -buildmode=archive 構建non-main packages成 .a 文件(靜態庫), -buildmode=c-archive c-archive 也就是將 package main 中導出的方法(// export 標記)編譯成 .a 文件, 這樣其它 c 程序就可以靜態鏈接該文件,并調用其中的方法 -buildmode=c-shared 構建C共享庫 -buildmode=default -buildmode選項的默認參數,把main packages構建成可執行文件,non-main packages構建成 .a 靜態庫。 -buildmode=shared 把所有non-main packages構建成一個go 共享庫,可以使用-linkshared選項進行鏈接。 -buildmode=exe 把 main packages以及它import的任何文件,構建成可執行文件。 -buildmode=pie 把 main packages以及它impiort的任何文件,構建成位置無關的目標文件(可重定位文件) -buildmode=plugin 把 main packages以及它import其他packages,構建成一個go plugin. ``` ## 實例 ### -buildmode=c-archive <details> <summary>add.go</summary> ``` package main import "fmt" import "C" func main() {} //export Add func Add(a, b int) int { fmt.Printf("%d + %d = %d\n", a, b, a+b) return a + b } ``` </details> <br/> <details> <summary>myadd.c</summary> ``` # include "add.h" int main(void) { Add(1, 2); return 0; } ``` </details> <br/> 運行 ``` > go build -buildmode=c-archive add.go > cc myadd.c add.a > ./a.out ``` > 使用 add.a 編譯生成的 a.out 有 1.8MB; ### -buildmode=c-shared 使用上個實例的 add.go,和 myadd.c ``` > go build -buildmode=c-shared -o add.so add.go > cc myadd.c add.so > cc myadd.c add.so ``` > 使用 add.so 編譯生成的 a.out 才 8.2KB; ### -buildmode=shared <details> <summary>hello.go</summary> ``` package main import "fmt" func main() { fmt.Println("hello world") } ``` </details> <br/> 執行 ``` > go install -buildmode=shared std > go build -linkshared hello.go > ldd hello linux-vdso.so.1 (0x00007ffcb0db9000) libstd.so => /usr/local/go/pkg/linux_amd64_dynlink/libstd.so (0x00007f2d5c1cb000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2d5bdda000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f2d5bbd6000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f2d5b9b7000) /lib64/ld-linux-x86-64.so.2 (0x00007f2d5eb96000) ``` > 生成的可執行文件體積才 20KB, "go build hello.go" 生成的 1.9MB 小非常多 >[warning] 當然如果缺少了其中某個鏈接庫或者版本不匹配,都將導致無法正常運行,所以一般情況下這種構建模式很少使用 ### -buildmode=plugin <details> <summary>demo.go</summary> ``` package main import "fmt" // 導出 var var ( V int VAR_B = "hello world B" ) // 導出函數 func F(a string) string { return fmt.Sprintf("%s:%d\n", a, V) } // 導出結構體 type num struct { res int } func NewNum() num { return num{} } func (n *num) Add(a, b int) { n.res = a + b } func (n *num) Result() int { return n.res } var Num = NewNum() ``` </details> <br /> <details> <summary>main.go</summary> ``` package main import ( "fmt" "plugin" ) type Numer interface { Add(int, int) Result() int } func main() { checkErr := func(err error) { if err != nil { panic(err) } } p, err := plugin.Open("./main.so") checkErr(err) b, err := p.Lookup("VAR_B") checkErr(err) var_b := *b.(*string) fmt.Printf("%+v\n", var_b) // hello world B v, err := p.Lookup("V") checkErr(err) *v.(*int) = 7 f, err := p.Lookup("F") checkErr(err) f2 := f.(func(string) string) fmt.Printf("%+v", f2("hello")) // hello:7 num, err := p.Lookup("Num") checkErr(err) n := num.(Numer) n.Add(1, 2) fmt.Printf("%+v\n", n.Result()) //3 } ``` </details> <br /> ``` go build -buildmode=plugin demo.go go run palette.go ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看