如何使用sqlite3.h和cgo打开一个新的sqlite3数据库?

时间:2014-04-26 18:29:05

标签: sqlite go cgo

我正在尝试使用sqlite3到c与cgo(我知道go有一个sqlite3包装器,但想尝试这种方式)。这个程序给我一个错误信息

(Undefined symbols for architecture x86_64:
"_sqlite3_open", referenced from:
  __cgo_1d4838eae1de_Cfunc_sqlite3_open in cGo.cgo2.o
 (maybe you meant: __cgo_1d4838eae1de_Cfunc_sqlite3_open)
 ld: symbol(s) not found for architecture x86_64
 clang: error: linker command failed with exit code 1 (use -v to see invocation)

,我不明白为什么 - 有人可以帮我理解如何打开新的数据库流吗?

// cGo
package main

/*
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
*/
import  "C"
//import "fmt"


func main() {
var t* C.sqlite3
C.sqlite3_open("test.db", t)

}

1 个答案:

答案 0 :(得分:3)

“未定义的符号”表示构建过程不会将您的代码与系统上的sqlite库链接。

现有的go-sqlite库通过放入包目录a C file来链接到SQLite,其中#include是SQLite的整个代码(lib / sqlite3.c在同一个包中)。它还提供了一些编译器标志(CFLAGS)和C包装函数in sqlite3.go

关于这种方法的方便之处在于它意味着SQLite最终会链接到您的二进制文件中,因此它的用户无需在运行程序之前单独安装SQLite。默认情况下,基于gc工具链(而不是gccgo)构建的只使用pure-Go库的程序是这样的,所以它就像那样“Go-y”。

另一种方法是在#cgo LDFLAGS: -lsqlite3声明之前的代码中使用cgo pragma extern "C";然后用户需要安装兼容的sqlite3库来使用您的二进制文件,但您不需要存储库中的源代码,这可能更容易。请注意,使用这种方法,想要构建您的软件包的人仍然需要在他们的系统上使用SQLite标头,例如,他们的Linux发行版可能提供的libsqlite3-dev软件包。

希望这对于cgo和库集成的一般帮助有价值。我认为只使用go-sqlite3或其他现有的包装器可能会更好。