【问题标题】:how to open a new sqlite3 database using sqlite3.h and cgo?如何使用 sqlite3.h 和 cgo 打开一个新的 sqlite3 数据库?
【发布时间】:2014-06-12 10:56:11
【问题描述】:

我正在尝试通过 C 将 sqlite3 与 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)

}

【问题讨论】:

    标签: sqlite go cgo


    【解决方案1】:

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

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

    这种方法的方便之处在于它意味着 SQLite 最终会直接链接到您的二进制文件中,因此它的用户不必在运行您的程序之前单独安装 SQLite。构建在 gc 工具链(与 gccgo 相对)上且仅使用纯 Go 库的程序默认采用这种方式,因此采用这种方式有点“Go-y”。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-18
      • 2011-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-24
      • 2012-10-04
      相关资源
      最近更新 更多