2014-04-26 62 views
1

我想通过C与cgo使用sqlite3(我知道去有一个sqlite3包装,但想要尝试这种方式)。这个节目给我一个错误消息如何使用sqlite3.h和cgo打开新的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) 

}

回答

3

“未定义的符号”是指构建过程中不与您的系统上SQLite库链接你的代码。

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

这种方法的便捷之处在于它意味着SQLite最终将二进制链接到右侧,因此用户无需在运行程序之前单独安装SQLite。基于gc工具链(相对于gccgo)构建的程序默认采用这种方式,所以这种方式默认为“Go-y”。

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

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

相关问题