iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 3
2
Software Development

自動化測試開發的美麗與憂愁系列 第 3

Go 朋友 - Golang與其他語言互動的方式 (cgo)

  • 分享至 

  • xImage
  •  

筆者很常使用golang 撰寫CLI tool, 那除了編譯成執行檔後被其他語言呼叫之外, 還可以什麼形式呢?

除此之外, 在開發的過程中, 很常會遇到需要在A語言中使用B語言的功能或是可能被迫要求把B語言重構成A語言. 那是否有可以直接使用的方法呢?

作法:

  1. 先確定golang 版本是否大於1.5
  2. Gcc 版本是否大於等於9.2

Q: 如果在編譯過程中遇到以下錯誤訊息, 該如何解?

error: implicit declaration of function '_beginthread' [-Werror=implicit-function-declaration]

A: 請更新您的GCC 版本, windows 的部份建議是直接安裝TDM-GCC後再重新做編譯即可

  1. 簡單寫支程式

multiplier.go

package main

import "C"
import "fmt"

//export HelloWorld
func HelloWorld() {
    fmt.Println("HelloWorld from DLL")
}

//export Sum
func Sum(a int, b int) int {
    return a + b;
}

//export Multiplier
func Multiplier(a int, b int) int {
    return a * b;
}

func main() {} 
  1. 編譯成C-shared library的形式, 簡單的說就是編譯成DLL或so 的檔案型態
go build -buildmode c-shared -o multiplier.dll multiplier.go

5.編譯成功後, 在資料夾內會看到已經產生出兩個檔案

  • C++ header file
  • DLL file

Q: 為什麼有時候在編譯完後不會自動產生C++ header file?

A: 原因如下:

引用自 hdr-C_references_to_Go

  1. 有了DLL 跟header file後就可以讓其他語言使用了

(1) 使用ipython 驗證

詳細程式碼及檔案請參考以下連結:
Demo source code - Github

  • multiplier.go
  • multiplier.h
  • operation.py
  • multiplier.dll

上一篇
[Python] Bomb!! Uiautomator x Thread = USB Port 掰掰 (平行控制)
下一篇
比勒索軟體更可怕的是 ... 防毒軟體
系列文
自動化測試開發的美麗與憂愁30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言