使用 gcc (mingw32) 編譯帶有靜態函式庫的 DLL
php小編百草為你介紹如何使用gcc (mingw32)編譯帶有靜態函式庫的DLL。在開發過程中,經常需要將靜態函式庫打包成DLL以便於在其他專案中呼叫。使用gcc (mingw32)編譯帶有靜態函式庫的DLL的方法相對簡單,只需按照一定的步驟操作即可。首先,確保已安裝mingw32和gcc編譯器。然後,在命令列中輸入gcc -shared -o libname.dll libname.a即可產生DLL檔。透過這種方式,你可以輕鬆地將靜態函式庫編譯為DLL,以便在其他專案中使用。
問題內容
我有一個由外部工具(即 cgo)產生的靜態函式庫,我們稱之為 libsecondary.a。我想產生一個動態函式庫,同時包含「libsecondary.a」作為依賴項,我在 libsecondary.h 中匯出一個名為 onprocessinit() 的函數,並在 dll_process_attach 事件上呼叫它。
我嘗試產生共享庫,但似乎無法使用 x86_64-w64-mingw32-共享-l。 -lsecondary -static-libgcc -static-libstdc -static .\dllmain.c
錯誤輸出是 dllmain.c:(.text 0x9b): 未定義對「onprocessinit」的引用,這是怎麼回事?
這是頭檔libsecondary.h
##/* code generated by cmd/cgo; do not edit. */ /* package command-line-arguments */ #line 1 "cgo-builtin-export-prolog" #include <stddef.h> #ifndef go_cgo_export_prologue_h #define go_cgo_export_prologue_h #ifndef go_cgo_gostring_typedef typedef struct { const char *p; ptrdiff_t n; } _gostring_; #endif #endif /* start of preamble from import "c" comments. */ /* end of preamble from import "c" comments. */ /* start of boilerplate cgo prologue. */ #line 1 "cgo-gcc-export-header-prolog" #ifndef go_cgo_prologue_h #define go_cgo_prologue_h typedef signed char goint8; typedef unsigned char gouint8; typedef short goint16; typedef unsigned short gouint16; typedef int goint32; typedef unsigned int gouint32; typedef long long goint64; typedef unsigned long long gouint64; typedef goint64 goint; typedef gouint64 gouint; typedef size_t gouintptr; typedef float gofloat32; typedef double gofloat64; #ifdef _msc_ver #include <complex.h> typedef _fcomplex gocomplex64; typedef _dcomplex gocomplex128; #else typedef float _complex gocomplex64; typedef double _complex gocomplex128; #endif /* static assertion to make sure the file is being used on architecture at least with matching size of goint. */ typedef char _check_for_64_bit_pointer_matching_goint[sizeof(void*)==64/8 ? 1:-1]; #ifndef go_cgo_gostring_typedef typedef _gostring_ gostring; #endif typedef void *gomap; typedef void *gochan; typedef struct { void *t; void *v; } gointerface; typedef struct { void *data; goint len; goint cap; } goslice; #endif /* end of boilerplate cgo prologue. */ #ifdef __cplusplus extern "c" { #endif extern __declspec(dllexport) void onprocessinit(); #ifdef __cplusplus } #endif
這是 dllmain.c
65be0f35ebbcbc這是導出的 golang 函式(我用 go build -buildmode=c-archive 編譯的函式)
package main import "C" import ( "unsafe" "syscall" ) //export OnProcessInit func OnProcessInit() { const ( NULL = 0 MB_OK = 0 ) caption := "Hola" title := "desdegoo" ret, _, _ := syscall.NewLazyDLL("user32.dll").NewProc("MessageBoxW").Call( uintptr(NULL), uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(caption))), uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(title))), uintptr(MB_OK)) if ret != 1 { return } return } func main() {}
解決方法
哇,答案是論證位置,
x86_64-w64-mingw32 -shared -static-libgcc -static-libstdc -static .\dllmain.c .\libsecondary.a
如果你向後輸入它,它將找不到來自 libsecondary.a 的引用,天哪......
上面的程式碼在載入時也會陷入死鎖,因為 syscall.NewLazyDLL 呼叫 LoadLibraryA,並且它被鎖定在 DLL_PROCESS_ATTACH 中,所以解決方法是 CreateThread 並在執行緒內執行 golang 匯出函數:)
以上是使用 gcc (mingw32) 編譯帶有靜態函式庫的 DLL的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

不要改變原內容的意思,微調內容,重寫內容,不要續寫紅米Note13RPro不僅性能出色,使用體驗更加出色,為了讓大家有更舒適的使用體驗,紅米Note13RPro配備了字體調整功能,讓用戶能夠調整自己的手機的字體。如果你想知道紅米Note13RPro怎麼調整字體大小,那就來看看吧。紅米Note13RPro怎麼調整字體大小? 1.開啟“設定”應用程式。 2.捲動到底部,選擇“顯示”。 3.點選“文字大小”。 4.在此畫面上,您可以拖曳滑桿調整字體大小或選擇預設字體大小。 5.調整完畢後,按「確定」保

typedef struct 在 C 語言中用於建立結構體類型別名,簡化結構體使用。它透過指定結構體別名將一個新的資料類型作為現有結構體的別名。優點包括增強可讀性、程式碼重複使用和類型檢查。注意:在使用別名前必須定義結構體,別名在程式中必須唯一且僅在其宣告的作用域內有效。

RedmiNote13RPro這款手機最近是非常火爆的,很多消費者都購買了這款手機,不過很多用戶是第一次使用這款手機所以不清楚紅米Note13RPro怎麼連接電腦,對此,小編在這裡為大家帶來了詳細的教學介紹。紅米Note13RPro怎麼連接電腦? 1.使用USB線將紅米手機連接到電腦的USB介面。 2.開啟手機設置,擊選項,將USB調試開啟。 3.在電腦上開啟裝置管理員,找到行動裝置選項。 4.右鍵點選行動裝置,選擇更新驅動程式,然後選擇自動搜尋更新的驅動程式。 5.如果電腦沒有自動搜尋到驅動程序,

紅米Note13RPro手機在軟體功能上整合了多項智慧工具,其中,從圖片中快速準確地提取文字內容便是其中之一,下面小編將為大家介紹紅米Note13RPro如何提取圖片中的文字。紅米Note13RPro怎麼擷取圖中的文字?使用小米掃碼功能,打開手機的掃碼應用,點擊圖片圖標,選擇一張圖片,然後點擊右邊的「識別文字」選項,成功提取圖片中的文字。透過手機相簿操作。在手機相簿中找到需要提取文字的圖片,點擊圖片下方的“更多”,選擇“提取文字”,識別成功後,可以根據需要複製或保存文字。利用微信小程式。打開微

整個活吧是一款非常好玩的休閒解謎小遊戲,大家可以在多平台體驗!遊戲提供了無數精彩的關卡等待解鎖,每個關卡都充滿了新奇和挑戰,讓你體驗回答問題的有趣冒險,開啟全新的遊戲內容。那麼整個活吧全關卡怎麼通關呢?今天為大家帶來了《整個活吧》全關卡通關攻略大全分享,大家過關遇到問題可以來參考一下哦! 《整個活吧》全關卡通關攻略大全《整個活吧》全關卡通關攻略大全幫她守歲人鬼情未了幫小姐姐識別渣男狼外婆幫小女孩脫離危險戶外探險假裝看不見阿飄變回人形幫猩猩修成人形後座有人保持鎮定和女鬼週旋夜班出租車保持鎮定和女鬼週

整個活吧是抖音上非常火辣的趣味闖關小遊戲,遊戲中有超多的關卡等大家挑戰!遊戲中關卡西遊美人這一關大家需要幫西遊女角色歸位,具體怎麼過關呢?以下是小編帶給大家的《整個活吧》西遊美人幫西遊女角色歸位通關攻略,不清楚如何過關的小伙伴們一起來看看吧,希望能幫到大家。 《整個活吧》西遊美人幫西遊女角色歸位通關攻略西遊美人幫西遊女角色歸位1、點擊捲軸出現女角色2、白骨精、孔雀精需要點擊切換動作3、答案如下圖所示:《整個活吧》全關卡通關攻略大全幫她守歲人鬼情未了幫小姐姐識別渣男狼外婆幫小女孩脫離危險戶外探險

《塵白禁區》軍艦鳥怎麼樣?在遊戲中有著許多的強力武器可供玩家進行選擇使用,小編已經幫助玩家整理好了軍艦鳥這把武器的詳細屬性介紹,一起來了解一下吧,希望能夠給玩家提供幫助。 《塵白禁區》軍艦鳥武器介紹一覽武器資訊武器介紹名稱軍艦鳥品級四星型衝鋒槍元素高熱射速1080彈容45實裝版本1.0武器技能:額外支援支援技使用後場上隊員獲得武器使用者攻擊力13.2%/15.4%/17.6%/19.8%/22%的攻擊力,持續15秒。突破材料20級:合成顆粒*430級:芳烴塑膠*3、合成顆粒*1040級:芳烴塑料

整個活吧是抖音上非常火辣的趣味闖關小遊戲,遊戲中有超多的關卡等大家挑戰!遊戲中關卡拯救鄰居這一關需要勸所有鄰居下樓,具體怎麼過關呢?以下是小編帶給大家的《整個活吧》拯救鄰居勸所有鄰居下樓通關攻略,不清楚如何過關的小夥伴們一起來看看吧,希望能幫到大家。 《整個活吧》拯救鄰居勸所有鄰居下樓通關攻略拯救鄰居勸所有鄰居下樓1、樓下有人需要急救2、樓下書店在賣絕版學習資料3、樓下垃圾桶好多紙箱4、我答應約會,你先下樓5、你家哥哥來咱們小區做推廣了6、有人發現了新的釣魚點7、拖動貓罐頭到樓下8、拖動叉子給
