溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

golang中怎么編譯二進制運行文件

發(fā)布時間:2021-06-15 14:30:09 來源:億速云 閱讀:380 作者:Leah 欄目:大數據

今天就跟大家聊聊有關golang中怎么編譯二進制運行文件,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

系統(tǒng)包含 sqlite 包的用普通編譯會出現(xiàn)異常

CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o $file_path . #編譯liunx系統(tǒng)可運行文件,會報錯

報以下錯誤

github.com/mattn/go-sqlite3

../../mattn/go-sqlite3/sqlite3_opt_preupdate.go:12:16: undefined: SQLiteConn

這時應該

CGO_ENABLED=0 改成 CGO_ENABLED=1

下一步運行,如果報

# os/user

/usr/local/go/src/os/user/getgrouplist_unix.go:16:35: warning: passing 'gid_t *' (aka 'unsigned int *') to parameter of type 'int *' converts between pointers to integer types with different sign [-Wpointer-sign]

/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include/unistd.h:653:43: note: passing argument to parameter here

# github.com/mattn/go-sqlite3

sqlite3-binding.c:32993:42: error: use of undeclared identifier 'pread64'

sqlite3-binding.c:33011:42: error: use of undeclared identifier 'pwrite64'

sqlite3-binding.c:33143:22: error: invalid application of 'sizeof' to an incomplete type 'struct unix_syscall []'

sqlite3-binding.c:33152:22: error: invalid application of 'sizeof' to an incomplete type 'struct unix_syscall []'

sqlite3-binding.c:33179:20: error: invalid application of 'sizeof' to an incomplete type 'struct unix_syscall []'

sqlite3-binding.c:33196:16: error: invalid application of 'sizeof' to an incomplete type 'struct unix_syscall []'

sqlite3-binding.c:14168:38: note: expanded from macro 'ArraySize'

sqlite3-binding.c:33200:14: error: invalid application of 'sizeof' to an incomplete type 'struct unix_syscall []'

sqlite3-binding.c:14168:38: note: expanded from macro 'ArraySize'

sqlite3-binding.c:35853:11: warning: type specifier missing, defaults to 'int' [-Wimplicit-int]

sqlite3-binding.c:32997:49: note: expanded from macro 'osPread64'

sqlite3-binding.c:35965:17: warning: type specifier missing, defaults to 'int' [-Wimplicit-int]

sqlite3-binding.c:33015:57: note: expanded from macro 'osPwrite64'

該問題 Mac未安裝linux的交叉編譯器。解決方法,安裝linux的交叉編譯器

下載地址

Compiling for Linux 32 and Linux 64 on MacOS X

修改編譯命令為

CGO_ENABLED=0 GOOS=linux CC=/usr/local/gcc-4.8.1-for-linux64/bin/x86_64-pc-linux-gcc go build -a -installsuffix cgo -o $file_path .

#cc路徑請下載時看清楚安裝包的默認路徑填寫

一般編譯出來的文件已經可以在liunx上運行了,但是如果放在docker上的 alpine系統(tǒng)上又會出現(xiàn)問題會無法執(zhí)行問題

這個問題一般是alpine沒有對應的依賴庫可以用下面的方法解決

查看下執(zhí)行文件的依賴庫:

ldd $WORKDIR/main

/lib64/ld-linux-x86-64.so.2 (0x7fdd15cd0000)

libpthread.so.0 => /lib64/ld-linux-x86-64.so.2 (0x7fdd15cd0000)

libc.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7fdd15cd0000)

直接系統(tǒng)操作

mkdir /lib64

ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2

對應dockerfile里的操作

RUN mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2

然后就可以正常工作了,原理是musl和glibc是兼容的,通過創(chuàng)建該符號鏈接修復缺少的依賴項。alpine這個5M的鏡像也能滿足go二進制文件的運行環(huán)境!

對于用alpine作為go的編譯環(huán)境同樣存在上述問題,同樣用相同方法可以解決。

看完上述內容,你們對golang中怎么編譯二進制運行文件有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI