我對 CGo 完全陌生。我不想使用 mattn 的 go-sqlite 包,而是想構建我自己的 SQLite 最小介面。
我試圖在我的 linux 機器上編譯最簡單的程式go build,它總是回傳相同的錯誤:
/usr/bin/ld: $WORK/b001/_x003.o: in function `unixDlError':
./sqlite3.c:42036: undefined reference to `dlerror'
/usr/bin/ld: $WORK/b001/_x003.o: in function `unixDlClose':
./sqlite3.c:42067: undefined reference to `dlclose'
/usr/bin/ld: $WORK/b001/_x003.o: in function `unixDlSym':
./sqlite3.c:42063: undefined reference to `dlsym'
/usr/bin/ld: $WORK/b001/_x003.o: in function `unixDlOpen':
./sqlite3.c:42022: undefined reference to `dlopen'
collect2: error: ld returned 1 exit status
專案布局如下:
- 去.mod
- main.go
- sqlite3.c
- sqlite3.h
內容如果main.go是:
//go:build cgo
// build cgo
package main
/*
#cgo CFLAGS: -DSQLITE_OMIT_LOAD_EXTENSION
#cgo CFLAGS: -DSQLITE_THREADSAFE=1
#include "sqlite.h"
*/
import "C"
func main() {
}
我正在使用 Go 1.18.1。
非常感謝任何朝著正確方向的幫助或推動!
uj5u.com熱心網友回復:
要將一些 C 代碼嵌入到 Go 檔案中,您可以將 C 陳述句撰寫為稱為preambles的東西。關于格式有一些嚴格的規則:
import "C"是一個獨立的陳述句,不能包含在一個import ()組中- C 包含和其他代碼(前導碼)緊接在
import "C"陳述句之前,中間沒有任何空行
所以在你的情況下,你需要的是:
package main
// #include "sqlite.h"
import "C"
import (
"fmt"
// normal imports here
)
正如您已經驗證的那樣:序言可以是多行注釋,因此請使用您喜歡的任何一個。import "C"最主要的是它們和陳述句之間沒有空行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/498262.html
