go程式在一些方面編寫優於c/c++,我們可以自己用go寫一些小組件用c/c++呼叫。所以我們需要將go程式源**編譯成linux平台下.a檔案或者window平台下的dll和lib檔案。
- vs2015:在windows平台下從.dll檔案匯出.lib的環境(windows下也可以直接使用dll來執行程式,我習慣加上lib的方式)
我們編寫乙個名為godll.go的程式go
package main
import "c"
import (
"fmt"
)//export intadd
func intadd(a int32,b int32) int32
//export goprint
func goprint(str string)
func main()
這個程式需要注意幾點:
- 程式注釋不能有中文
- package main和func main()必須有,匯出的包必須是含有main的
- 匯出的函式前面用//export +函式名宣告,表示需要匯出該函式
- 引用包import "c"
**linux下**
我們使用go build命令編譯此程式,命令格式為
go build -buildmode=c-archive goflie.go //替換gofile.go為編譯的檔名
執行之後我們會得到.a檔案和.**件,到此linux下我們就算完成了。接下來步驟都是針對windows下的
**windows下**
我們使用go build命令編譯此程式,命令格式為
go build -buildmode=c-shared -o gofile.dll gofile.go //替換gofile為編譯的檔名
編譯後得到 .dll 和 .h 兩個檔案。其實windows下此時我們也算完成了,但是我習慣使用有靜態庫的方式,所以接下來主要利用dll生成lib
從dll檔案生成lib檔案的過程我們需要乙個def檔案,def檔案中描述的是匯出的函式列表。因為我們知道dll檔案中匯出函式列表所以我們可以直接新建乙個def檔案手寫。
新建乙個def檔案,用編輯器開啟此檔案,新增需要匯出的函式列表
library
exports
intadd
goprint
注意函式名的書寫一定要和匯出函式一樣
有了def檔案我們就可以生成lib檔案了,此時我們需要使用vs2015提供的lib.exe檔案(路徑:c:\program files (x86)\microsoft visual studio 14.0\vc\bin)。
首先將lib.exe所在目錄新增到環境變數的path目錄下,然後在cmd下執行以下命令
生成目標64位的命令格式:
lib /def:deffile.def /machine:x64 /out:libfile.lib
生成目標32位的命令格式:
lib /def:deffile.def /machine:x86 /out:libfile.lib
此時lib檔案生成就完成了
根據生成的h,dll,lib檔案我們使用c/c++測試,新建main.cpp在下面新增**
#include #include "godll.h"
#include #pragma comment(lib,"godll.lib")
gostring stringtogostring(std::string str)
int main()
編譯發現會出錯,此時我們需要注釋標頭檔案下的三行**
//typedef __size_type__ gouintptr;
//typedef float _complex gocomplex64;
//typedef double _complex gocomplex128;
編譯通過,大功告成!!!
參考:
把Go程式發布成windows服務
近日正在考慮用go程式做乙個報表計算服務,在g 上看到有老外介紹把go打包的exe發布成window service,遂把該文章翻譯過來,一同分享。大致方法 b 1.b 第一步當然是先將你的go程式打包成exe,比如go web server。b 2.b 使用nssm發布windows服務,命令 n...
windows下用go語言寫程式
linux下,google的go語言安裝起來很方便,用起來也很爽,幾行 就可以實現很強大的功能。現在的問題是我想在windows下玩 其實windows下也不麻煩,具體見下文。二 寫go 檔案 test.go 如下 package main import fmt func main test 四 批...
Windows 程式移植到Linux平台的一波N折
本人前端時間寫了個html檔案分析器,windows平台上的vc6.0,使用標準c 昨天接到指令,應要求要發布乙個linux版本的,茫然啦,linux下面的hello world都沒有玩過,對linux下的c 程式僅僅限於聽他們神吹過的gcc,g makefile什麼的,其他一概不知。這就注定移植過...