文档章节

Mingw静态编译go-sqlite3包

棋有此理
 棋有此理
发布于 2012/10/11 22:03
字数 1356
阅读 2715
收藏 6

    在github.com/mattn/go-sqlite3上,作者说在windows下使用go-sqlite3要使用动态链接的方法[Go does not support static linking for external C library; sqlite3 should be built as a shared library. If it runs on Windows, it needs dll.],结合网上的资源,我整理出了如何使用静态编译的方法使用go-sqlite3。

    折腾的过程中发现使用go get命令的时候会把源码下载到go的安装目录\src\pkg\下,然后使用go install 的时候会编译包再安装的pkg目录下。src\pkg\github.com\mattn\go-sqlite3 这是go-sqlite3下载到本地后的目录结构。网上的资源是在Google groups找到的how to build "go-sqlite3" under windows with x64 ,内容如下:

Hi all. i got the solution. i hope it can help someone like me .

1. install tdm64-gcc

2. download the source code of sqlite3

3. go get https://github.com/mattn/go-sqlite3

4. unzip it and copy all files except shell.c to  github.com/mattn/go-sqlite3 directory

5. change sqlite3.go

    1) delete "#cgo pkg-config: sqlite3"

    2) change #include <sqlite3.h> to  #include "sqlite3.h"

    3) add

       #cgo windows LDFLAGS: -lmingwex -lmingw32

       #cgo windows CFLAGS: -fno-stack-check -fno-stack-protector -mno-stack-arg-probe

6. go install github.com/mattn/go-sqlite3  and test it 

the final sqlite3.go's beginning like this:

package sqlite

/*

#include "sqlite3.h"
#include <stdlib.h>
#include <string.h>

#cgo windows LDFLAGS: -lmingwex -lmingw32
#cgo windows CFLAGS: -fno-stack-check -fno-stack-protector -mno-stack-arg-probe

static int

_sqlite3_bind_text(sqlite3_stmt *stmt, int n, char *p, int np) {
  return sqlite3_bind_text(stmt, n, p, np, SQLITE_TRANSIENT);
}

static int
_sqlite3_bind_blob(sqlite3_stmt *stmt, int n, void *p, int np) {
  return sqlite3_bind_blob(stmt, n, p, np, SQLITE_TRANSIENT);
}

*/

import "C"

    按如上的步骤,没有下载安装tdm-gcc,其实tdm-gcc也就是mingw,执行go install github.com/mattn/go-sqlite3 之后能顺利的生成包go-sqilte3.a。然后就使用《Go web编程中》的例子使用SQLite数据库,进行测试,原始代码如下:

package main

import (
    "database/sql"
    "fmt"
    _ "github.com/mattn/go-sqlite3"
)

func main() {
    db, err := sql.Open("sqlite3", "./foo.db")
    checkErr(err)

    //插入数据
    stmt, err := db.Prepare("INSERT INTO userinfo(username, departname, created) values(?,?,?)")
    checkErr(err)

    res, err := stmt.Exec("astaxie", "研发部门", "2012-12-09")
    checkErr(err)

    id, err := res.LastInsertId()
    checkErr(err)

    fmt.Println(id)
    //更新数据
    stmt, err = db.Prepare("update userinfo set username=? where uid=?")
    checkErr(err)

    res, err = stmt.Exec("astaxieupdate", id)
    checkErr(err)

    affect, err := res.RowsAffected()
    checkErr(err)

    fmt.Println(affect)

    //查询数据
    rows, err := db.Query("SELECT * FROM userinfo")
    checkErr(err)

    for rows.Next() {
        var uid int
        var username string
        var department string
        var created string
        err = rows.Scan(&uid, &username, &department, &created)
        checkErr(err)
        fmt.Println(uid)
        fmt.Println(username)
        fmt.Println(department)
        fmt.Println(created)
    }

    //删除数据
    stmt, err = db.Prepare("delete from userinfo where uid=?")
    checkErr(err)

    res, err = stmt.Exec(id)
    checkErr(err)

    affect, err = res.RowsAffected()
    checkErr(err)

    fmt.Println(affect)

}

func checkErr(err error) {
    if err != nil {
        panic(err)
    }
}

在Liteide中编译链接后报如下的错误:

D:\go\go1.0.2.windows-386\go/pkg/windows_386/github.com/mattn/go-sqlite3.a(sqlite3.o)(.text):__moddi3: not defined?

D:\go\go1.0.2.windows-386\go/pkg/windows_386/github.com/mattn/go-sqlite3.a(sqlite3.o)(.text): __divdi3: not defined?

D:\go\go1.0.2.windows-386\go/pkg/windows_386/github.com/mattn/go-sqlite3.a(sqlite3.o)(.text): __moddi3: not defined?

D:\go\go1.0.2.windows-386\go/pkg/windows_386/github.com/mattn/go-sqlite3.a(sqlite3.o)(.text):__divdi3: not defined?

D:\go\go1.0.2.windows-386\go/pkg/windows_386/github.com/mattn/go-sqlite3.a(sqlite3.o)(.text): __divdi3: not defined?D:\go\go1.0.2.windows-386\go/pkg/windows_386/github.com/mattn/go-sqlite3.a(sqlite3.o)(.text): __divdi3: not defined?D:\go\go1.0.2.windows-386\go/pkg/windows_386/github.com/mattn/go-sqlite3.a(sqlite3.o)(.text): __divdi3: not defined?D:\go\go1.0.2.windows-386\go/pkg/windows_386/github.com/mattn/go-sqlite3.a(sqlite3.o)(.text): __moddi3: not defined?D:\go\go1.0.2.windows-386\go/pkg/windows_386/github.com/mattn/go-sqlite3.a(sqlite3.o)(.text):__divdi3: not defined?D:\go\go1.0.2.windows-386\go/pkg/windows_386/github.com/mattn/go-sqlite3.a(sqlite3.o)(.text):__moddi3: not defined?D:\go\go1.0.2.windows-386\go/pkg/windows_386/github.com/mattn/go-sqlite3.a(sqlite3.o)(.text):__moddi3: not defined?D:\go\go1.0.2.windows-386\go/pkg/windows_386/github.com/mattn/go-sqlite3.a(sqlite3.o)(.text):__divdi3: not defined?D:\go\go1.0.2.windows-386\go/pkg/windows_386/github.com/mattn/go-sqlite3.a(sqlite3.o)(.text):__divdi3: not defined?D:\go\go1.0.2.windows-386\go/pkg/windows_386/github.com/mattn/go-sqlite3.a(sqlite3.o)(.text):__divdi3: not defined?D:\go\go1.0.2.windows-386\go/pkg/windows_386/github.com/mattn/go-sqlite3.a(sqlite3.o)(.text):__divdi3: not defined?D:\go\go1.0.2.windows-386\go/pkg/windows_386/github.com/mattn/go-sqlite3.a(sqlite3.o)(.text):__moddi3: not defined?D:\go\go1.0.2.windows-386\go/pkg/windows_386/github.com/mattn/go-sqlite3.a(sqlite3.o)(.text):__moddi3: not defined?D:\go\go1.0.2.windows-386\go/pkg/windows_386/github.com/mattn/go-sqlite3.a(sqlite3.o)(.text):__umoddi3: not defined?D:\go\go1.0.2.windows-386\go/pkg/windows_386/github.com/mattn/go-sqlite3.a(sqlite3.o)(.text):__udivdi3: not defined?D:\go\go1.0.2.windows-386\go/pkg/windows_386/github.com/mattn/go-sqlite3.a(sqlite3.o)(.text):__umoddi3: not defined?D:\go\go1.0.2.windows-386\go/pkg/windows_386/github.com/mattn/go-sqlite3.a(sqlite3.o)(.text):__udivdi3: not defined?

too many errors?exit code 2, process exited normally.

提示找不到这几个函数,再次搜索看这几个函数在那个库中的时候,找到如下的资源,链接地址是:

https://groups.google.com/forum/?fromgroups=#!topic/golang-nuts/VNP6Mwz_B6o

On Thu, Jul 21, 2011 at 5:09 PM, brainman  <alex.b...@gmail.com> wrote:
Hey. I know nothing about gcc but if I remove your line of


#cgo windows LDFLAGS: -lpthread -lgcc_s -lmingwex -lmsvcrt

I could build your package

make clean
make all

The test

make test

fails:

gotest

rm -f _test/camdev/sqlite.a
8g  -o _gotest_.8  _obj/vfs.cgo1.go _obj/sqlite.cgo1.go _obj/_cgo_gotypes.go sqlite_test.go
rm -f _test/camdev/sqlite.a
gopack grc _test/camdev/sqlite.a _gotest_.8  _cgo_defun.8 _cgo_import.8 sqlite3_obj.o vfs.o  vfs.cgo2.o sqlite.cgo2.o _cgo_export.o
_test/camdev/sqlite.a(sqlite3_obj.o)(.text): __divdi3: not defined
_test/camdev/sqlite.a(sqlite3_obj.o)(.text): __moddi3: not defined
_test/camdev/sqlite.a(sqlite3_obj.o)(.text): __moddi3: not defined
_test/camdev/sqlite.a(sqlite3_obj.o)(.text): __divdi3: not defined

Those are in -lgcc_s.
这样在sqlite3.go 修改成这样#cgo windows LDFLAGS: -lmingwex -lmingw32 -lgcc_s
再次执行go install github.com/mattn/go-sqlite3 报如下的错误,
# github.com/mattn/go-sqlite3
D:\mingw\bin/ld.exe: cannot find -lgcc_s
collect2.exe: error: ld returned 1 exit status
提示没有找到这个libgcc_s.a,经查找发现这是Mingw的一个基本库文件在如下的地址可以下载到:
http://sourceforge.net/projects/mingw/files/MinGW/Base/gcc/Version4/gcc-4.7.0-1/gcc-core-4.7.0-1-mingw32-bin.tar.lzma/download,是安装Mingw时没有安装完全导致的。后来也试了一下tdm-gcc,这个打包的mingw中比较完全,比Mingw 官网的那个安装工具安装的全面些。最后编译go-sqlite3通过,再次编译示例代码,正常通过,然后用sqlite的shell 工具建立表结构,运行后结果正确。

© 著作权归作者所有

共有 人打赏支持
棋有此理

棋有此理

粉丝 12
博文 14
码字总数 14029
作品 2
通州
程序员
加载中

评论(8)

xdeng
xdeng

引用来自“棋有此理”的评论

引用来自“xdeng”的评论

告诉我怎么编译啊 我这直接 go get 有问题的

把go get的的输出贴出来吧,估计是访问超时,被墙了。

没错的 是编译有问题 类似于
D:\go\go1.0.2.windows-386\go/pkg/windows_386/github.com/mattn/go-sqlite3.a(sqlite3.o)(.text):__moddi3: not defined?

D:\go\go1.0.2.windows-386\go/pkg/windows_386/github.com/mattn/go-sqlite3.a(sqlite3.o)(.text): __divdi3: not defined?

D:\go\go1.0.2.windows-386\go/pkg/windows_386/github.com/mattn/go-sqlite3.a(sqlite3.o)(.text): __moddi3: not defined?

D:\go\go1.0.2.windows-386\go/pkg/windows_386/github.com/mattn/go-sqlite3.a(sqlite3.o)(.text):__divdi3: not defined?
棋有此理
棋有此理

引用来自“xdeng”的评论

告诉我怎么编译啊 我这直接 go get 有问题的

把go get的的输出贴出来吧,估计是访问超时,被墙了。
xdeng
xdeng
告诉我怎么编译啊 我这直接 go get 有问题的
棋有此理
棋有此理

引用来自“yousee”的评论

引用来自“yousee”的评论

"Those are in -lgcc_s.

这样在sqlite3.go 修改成这样#cgo windows LDFLAGS: -lmingwex -lmingw32 -lgcc_s

再次执行go install github.com/mattn/go-sqlite3 报如下的错误,


# github.com/mattn/go-sqlite3

D:\mingw\bin/ld.exe: cannot find -lgcc_s

collect2.exe: error: ld returned 1 exit status

提示没有找到这个libgcc_s.a,经查找发现这是Mingw的一个基本库文件在如下的地址可以下载到"

这里开始不明白..sqlite3.go里没有#cgo windows LDFLAGS: -lmingwex -lmingw32 -lgcc_s这么一句啊..

现在的go-sqlite3修改sqlite3-windows.go文件..在#cgo那行后加-lgcc_s就行了'

可能是最新的版本了
yousee
yousee

引用来自“yousee”的评论

"Those are in -lgcc_s.

这样在sqlite3.go 修改成这样#cgo windows LDFLAGS: -lmingwex -lmingw32 -lgcc_s

再次执行go install github.com/mattn/go-sqlite3 报如下的错误,


# github.com/mattn/go-sqlite3

D:\mingw\bin/ld.exe: cannot find -lgcc_s

collect2.exe: error: ld returned 1 exit status

提示没有找到这个libgcc_s.a,经查找发现这是Mingw的一个基本库文件在如下的地址可以下载到"

这里开始不明白..sqlite3.go里没有#cgo windows LDFLAGS: -lmingwex -lmingw32 -lgcc_s这么一句啊..

现在的go-sqlite3修改sqlite3-windows.go文件..在#cgo那行后加-lgcc_s就行了'
yousee
yousee
"Those are in -lgcc_s.

这样在sqlite3.go 修改成这样#cgo windows LDFLAGS: -lmingwex -lmingw32 -lgcc_s

再次执行go install github.com/mattn/go-sqlite3 报如下的错误,


# github.com/mattn/go-sqlite3

D:\mingw\bin/ld.exe: cannot find -lgcc_s

collect2.exe: error: ld returned 1 exit status

提示没有找到这个libgcc_s.a,经查找发现这是Mingw的一个基本库文件在如下的地址可以下载到"

这里开始不明白..sqlite3.go里没有#cgo windows LDFLAGS: -lmingwex -lmingw32 -lgcc_s这么一句啊..
棋有此理
棋有此理

引用来自“ChenMillken”的评论

测试通过,不过我这边无须最后一步,不知道为什么 。

可能是你的Mingw库文件都齐全.
C
ChenMillken
测试通过,不过我这边无须最后一步,不知道为什么 。
windows下安装和升级mingw二进制组件

已有环境:mingw4.5.2 + msys-cn gnu的gcc源码已更新至4.8.2,mingw官网提供4.8.1版本,现通过直接安装二进制包的方式安装4.8.1版的mingw。预先大致阅读官网文章(mingwhowto),按照官网的说法...

silaoA
2014/02/19
0
0
MinGW在Win7下的按装、设置和使用 (Lu Hongling)

1.引言 MinGW is the abbreviation of “Minimalist GCC Windows”. 简单地说, MinGW就是windows下的GCC [2]. 在windows下按装了MinGW, 就按装了C/C++, Fortran, 等语言编译器套间. MinGW是完...

luhongling
2012/08/19
0
0
OpenCV2.4.2+Qt SDK1.2.1安装配置详解(WIN7环境上安装)

原文为《OpenCV2.3.1+Qt SDK1.2.1安装配置详解(WIN7环境下安装)》,2.4.2可以用同样的方法配置,不过2.4.3暂时无法通过编译。原文如下: 1、安装工具下载地址 OpenCV2.3.1 :点击打开链接 ...

vazor
2012/11/15
0
0
eclipse3.4 + MinDW-5.1.4 c/c++开发环境配置(完整)

大致步骤如 摆渡生活 文章所写,我只补充一点:在安装完 MinDW 后还应该安装 gdb-6.3-2.exe。以增加对程序的Debug功能。 ================================...

曾赛
2010/04/27
0
0
关于在windows下安装golua具体实践

这几天考虑在golang中嵌入lua脚本,在网上找了很多golang封装的lua,最后找到了https://github.com/aarzilli/golua,它是https://github.com/afitz/golua的一个分支,这个aarzilli/golua目前一...

wkh
2013/09/25
0
4

没有更多内容

加载失败,请刷新页面

加载更多

活动招募 HUAWEI HiAI公开课·北京站-如何在4小时把你的APP变身AI应用

人工智能和机器学习是全球关注的新趋势,也是当前最火爆、最流行的话题。当你拿手机用语音助手帮你点外卖,智能推荐帮你把周边美食一网打尽;当你拿起P20拍照时,它将自动识别场景进行最美优...

华为终端开放实验室
7分钟前
0
0
匹配两位小数,js正则

var regex = /^\d*(\.[1-9]|\.\d[1-9])*$/ console.log(1.2,regex.test(1.2)); console.log(0.3,regex.test(0.3)); console.log(1.03,regex.test(1.03)); ......

微信小程序-暗潮
11分钟前
0
0
905. Sort Array By Parity - LeetCode

Question 905. Sort Array By Parity Solution 题目大意:数组排序,偶数放前,奇数在后,偶数的数之间不用管顺序,奇数的数之间也不用管顺序 思路:建两个list,一个放偶数,一个放奇数,最...

yysue
16分钟前
0
0
h5 禁止手机自带键盘弹出

html: <div style="width: 350px;margin:50px auto;"><input type="text" id="datePicker" class="date_picker form-control" placeholder="点击选择入住日期" /></div> js: $("#date......

Delete90
33分钟前
1
0
color透明度对照表

透明度百分比 数值 100% 不透明 FF 95% F2 90% E6 85% D9 80% CC 75% BF 70% B3 65% A6 60% 99 55% 8C 50% 80 45% 73 40% 66 35% 59 30% 4D 25% 40 20% 33 15% 26 10% 1A 5% 0D 0% 完全透明 ......

_无问西东
34分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部