Copyright © 1999-2020, CSDN.NET, All Rights Reserved
打開APP
銀色種子
關注
go 編譯步驟 原創
2021-04-23 16:29:49
銀色種子
碼齡7年
關注
## go 步驟
```
/*
Go項目構建及編譯
一個Go工程中主要包含以下三個目錄:
src:源代碼文件
pkg:包文件
bin:相關bin文件
1: 建立工程文件夾 goproject
2: 在工程文件夾中建立src,pkg,bin文件夾
3: 在GOPATH中添加projiect路徑 例 e:/goproject
4: 如工程中有自己的包examplepackage,那在src文件夾下建立以包名命名的文件夾 例 examplepackage
5:在src文件夾下編寫主程序代碼代碼 goproject.go
6:在examplepackage文件夾中編寫 examplepackage.go 和 包測試文件 examplepackage_test.go
7:編譯調試包
go build examplepackage
go test examplepackage
go install examplepackage
這時在pkg文件夾中可以發現會有一個相應的操作系統文件夾如windows_386z,
在這個文件夾中會有examplepackage文件夾,在該文件中有examplepackage.a文件
8:編譯主程序
go build goproject.go
成功後會生成goproject.exe文件
至此一個Go工程編輯成功。
*/
❷ golang編譯dll給C#調用
最近需要用到golang編譯dll給C#調用,記錄一下,希望可以給遇到的朋友一些幫助。
開發環境:
1.windows7,VS2019,VScode
2.macOS,VScode
習慣在macos開發golang應用,先寫好了dll,可以參考:
https://blog.csdn.net/henreash/article/details/88768206
然後在windows7上面使用C#調用的時候出現不能識別dll,於是只好在windows7安裝golang開發環境。
簡單安裝了VScode和mingw64.
https://sourceforge.net/projects/mingw-w64/
測試時發現了一個問題,如下:
最後找到的原因是我的windows7是64位的,mingw也是64位的,需要在VS2019裡面將目標平台設置如下:
當然,也可以將目標平台設置為x64的即可,我這樣設置,系統就自己去適配了。
網上的大部分是說設置目標平台為x86,這個要根據具體情況而來,不能一概而論。好了,希望能幫到您。
❸ Go 是怎麼使用 Go 來編譯自身的
是Go語言嗎?
Go 編譯過程 九個步驟
第一步. all.bash
% cd $GOROOT/src
% ./all.bash
第一步 all.bash 只是調用了另外兩個 shell 腳本:make.bash 和run.bash。若使用 Windows 或 Plan9,其過程也基本類似,只是腳本分別以 .bat 或 .rc 結尾。在文章的其他部分,請用適當的操作系統對應的擴展來補全命令。
第二步. make.bash
. ./make.bash --no-banner
make.bash 作為 all.bash 內容的一部分,如果它退出也會中斷構建過程
第三步. cmd/dist
gcc -O2 -Wall -Werror -ggdb -o cmd/dist/dist -Icmd/dist cmd/dist/*.c
當健全檢查完成後,make.bash 開始編譯 cmd/dist。
第四步. go_bootstrap
現在 go_bootstrap 已經構建完成,make.bash 的最後一步是使用 go_bootstrap 編譯完整的 Go 標准庫,包括一個完整的 go 工具用以替換。
echo "# Building packages and commands for $GOOS/$GOARCH."
"$GOTOOLDIR"/go_bootstrap install -gcflags "$GO_GCFLAGS" \
-ldflags "$GO_LDFLAGS" -v std
第五步. run.bash
現在 make.bash 已經完成,回到 all.bash 的執行,這會調用 run.bash。run.bash 的任務是編譯和測試標准庫、運行時以及語言測試集。
bash run.bash --no-rebuild
由於 make.bash 和 run.bash 都會調用 go install -a std,因此需要使用 –no-rebuild 標志來避免重復前面的步驟,–no-rebuild 跳過了第二個 go install。
# allow all.bash to avoid double-build of everythingrebuild=trueif [ "$1" = "--no-rebuild" ]; then shiftelse echo '# Building packages and commands.' time go install -a -v std echofi
第六步. go test -a std
echo '# Testing packages.'
time go test std -short -timeout=$(expr 120 \* $timeout_scale)s
echo
接下來 run.bash 會在標准庫里所有的包上來運行用 testing 包編寫的單元測試。由於 $GOPATH 和 $GOROOT 中有著相同的命名空間,所以不能直接使用 go test … 否則 $GOPATH 中的每個包也會被逐一測試,因此創建了一個用於標准庫中的包的別名:std。由於一些測試需要比較長的時間,且會消耗大量內存,因此用 -short 標志對一些測試進行了過濾。
第七步. runtime 和 cgo 測試
run.bash 接下來的部分會運行平台對 cgo 支持的測試,執行一些性能測試,並且編譯一些伴隨 Go 發行版一起的雜項程序。隨著時間的流逝,這些雜項程序的清單會越來越長,那麼它們也就會不可避免的被從編譯過程中悄悄剝離出去。
第八步. go run test
(xcd ../test
unset GOMAXPROCS
time go run run.go
) || exit $?
run.bash 的倒數第二步會調用在 $GOROOT 下的 test 目錄里的編譯器和運行時的測試。他們是對於編譯器和運行時自身的,較為低級細節的測試。會執行語言規格測試,test/bugs 和 test/fixedbugs 子目錄保存有那些已經被發現並被修復的問題的獨立的測試。驅動測試的是一個小 Go 程序 $GOROOT/test/run.go,會執行 test 目錄里的每個 .go 文件。一些 .go 文件的首行包含了指導 run.go 對結果作出判斷的指令,例如,程序將會失敗,或提供一個確定的輸出隊列。
第九步. go tool api
echo '# Checking API compatibility.'
go tool api -c $GOROOT/api/go1.txt,$GOROOT/api/go1.1.txt \
-next $GOROOT/api/next.txt -except $GOROOT/api/except.txt
run.bash 的最後一步調用了 api 工具。
❹ golangdll載入失敗
很抱歉您遇到了Golangdll載入失敗的問題。這可能是由於您的操作系統版本、硬體配置或者Golangdll文件本身的問題導致的。首先,您可以嘗試更新您的操作系統版本,以確保您的系統支持Golangdll文件。其次,您可以檢查您的硬體配置,以確保您的硬體配置足夠支持Golangdll文件。最後,您可以重新下載Golangdll文件,以確保您下載的文件是最新的。如果您仍然無法解決Golangdll載入失敗的問題,您可以嘗試聯系Golangdll官方客服,他們可以為您提供更多的幫助。
❺ 易語言轉go
你好,使用golang寫動態庫,再使用易語言寫界面,肯定有不少人有這種想法吧;但中間有些坑,這里留下一些解決方法。
一、如何編譯?
請先安裝gcc編譯器,選擇32位
由於易語言只支持32位dll,使用64位會出錯,例如找不到此函數;
必須先設置兩項配置:set GOARCH=386,set CGO_ENABLED=1,用cmd;
編譯命令:go build -ldflags "-s -w" -buildmode=c-shared -o dlldemo.dll dlldemo.go 。
二、形參與返回值
在go中,除了 string 特殊外,其他int、bool,等基本類型原本怎樣還是怎樣;
傳 string 與返回值 string 都改成 *C.char 類型,其他基本類型不用改;
有三個方法比較重要,C.CString 轉成c字元串,C.GoString 轉成go字元串 , C.free 釋放內存;
只要用到 C.CString 此方法,就必須記得釋放內存。
三、內存泄漏
如果使用了 C.CString 卻不使用 C.free ,內存暫用只會越來越大,最後奔潰;
釋放內存時,請不要重復取地址,例如 unsafe.Pointer(&xx變數) ,這樣等於沒釋放;
也可能是vc6的原因,使用 defer 在即將出棧時釋放,會造成易語言得不到返回值;
解決方法,聲明全局變數,將結果賦值給全局變數,專門定義一個釋放函數例如FreeAll() 用於釋放!
四、如何調用
在填寫dll命令時,請在填寫,在庫中對應命令名時,前面加個 @ ,不然會出現棧錯誤;
每次調用返回值是文本型dll命令時,請都使用前面准備的 FreeAll() 釋放內存!
通過易語言的便捷,為自己的golang小項目加點gui吧,這里留下源碼,給有需要的人。
希望能幫到你。
❻ golang調用DLL中的函數
在golang中載入dll並調用函數流程如下:
1.載入dll動態庫到內存 syscall.LoadLibrary
2.獲取函數地址 syscall.GetProcAddress
3.執行系統調用,傳入參數 syscall.Syscall6
一個系統消息框函數的調用示例:
❼ goland,cgo載入32位DLL遇到的問題
第一次開發Go程序,使用Goland過程中遇到的一些問題,開發的Go後台需要使用到Windows的一個32位DLL動態庫,此為原由,整個過程如下。
在按照上述方式配置好環境,並嘗試使用CGO載入DLL時,執行GOLAND的DEBUG提示如下。
經過搜索猜測,是目標機器架構選擇錯誤導致的。
但是在環境配置中,已經正確的選擇了Arch為386,嘗試使用liteIDE或者直接使用命令行編譯,都能夠正常編譯。唯獨使用GoLand不行。
看現象應該是設置沒有生效,最後嘗試在Run/Debug Configurations再次設置Go env解決此問題。步驟如下:
再次點擊debug,發現debug失敗,提示如下內容。
這是因為,goland在debug時使用的是dlv插件,該插件還不支持32位程序的調試,直接執行run就可以了。
在使用命令行編譯go程序時,可以使用go env命令查看當前編譯環境設置。
假如需要修改 GOARCH為386,繼續輸入命令行 set GOARCH=386 即可,如果重新打開cmd終端,則需要重新設置。所以如果使用命令行編譯,可以寫一個bat文件,每次都自動先把環境設置好。
❽ golang項目中使用條件編譯
golang中沒有類似C語言中條件編譯的寫法,比如在C代碼中可以使用如下語法做一些條件編譯,結合宏定義來使用可以實現諸如按需編譯release和debug版本代碼的需求
build tags 是通過代碼注釋的形式實現的,要寫在文件的最頂端;
go build指令在編譯項目的時候會檢查每一個文件的build tags,用來決定是編譯還是跳過該文件
build tags遵循以下規則
示例:
約束此文件只能在支持kqueue的BSD系統上編譯
一個文件可能包含多行條件編譯注釋,比如:
約束該文件在linux/386 或 darwin/386平台編譯
需要注意的點
正確的寫法如下:
編譯方法:
具有_$GOOS.go後綴的go文件在編譯的時候會根據當前平台來判斷是否將該文件導入並編譯;同樣適用於處理器架構判斷 _$GOARCH.go。
兩者可以結合起來使用,形式為: _$GOOS_$GOARCH.go
示例:
文件名必須提供,如果只由後綴的文件名會被編譯器忽略,比如:
這兩個文件會被編譯器忽略,因為以下劃線開頭的文件都會被忽略
❾ 如何用go調用windows下的c++ 開發的dll及回調進來
關鍵是 lpOnRecvCardEvent 這個函數的第二個參數是個 C++ 指針。 樓主在 C# 中聲明這個導出函數時,使用了並不對應的 CardEvent[] C# 數組類型。 正確的做法是: 在 C# 聲明 lpOnRecvCardEvent 時,第二個參數應該是 IntPtr ,不是數組。 由於樓...