文档章节

Mingw静态编译go-sqlite3包

棋有此理
 棋有此理
发布于 2012/10/11 22:03
字数 1356
阅读 2.9K
收藏 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 工具建立表结构,运行后结果正确。

© 著作权归作者所有

棋有此理

棋有此理

粉丝 13
博文 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库文件都齐全.
www_dnsoa_com
www_dnsoa_com
测试通过,不过我这边无须最后一步,不知道为什么 。
windows7下安装msys2

系统: windows 7 首先需要msys2的安装包,可以去官网下载安装包 官网地址: http://www.msys2.org/ 本次下载的是 msys2-x86_64-20190524.exe 注意:1.msys2不可以安装在FAT*分区    2.msys2不...

zqifa
2019/06/04
0
0
MinGW到底是个什么ghost

MinGW到底是个什么ghost 0.什么是MinGW MinGW,即 Minimalist GNU For Windows。它是一些头文件和端口库的集合,该集合允许人们在没有第三方动态链接库的情况下使用 GCC(GNU Compiler C)产...

lengye7
03/31
0
0
MinGW MinGW-w64 TDM-GCC等工具链之间的区别与联系

不当之处,尽请指正。 相同点: 一、 他们都是用于编译生成Windows应用程序的工具链。 二、 他们都是基于gcc的。 不同之处(只说大的): 一、项目之间的关系 1. MinGW应该是最先诞生的。 2....

lengye7
03/31
0
0
MSYS2使用教程(整理)——win10系统64位安装msys2最新版(msys2-x86_64-20190524.exe)

一、安装 测试系统: windows 10 首先需要msys2的安装包,可以去官网下载安装包 官网地址: http://www.msys2.org/ 本次下载的是 msys2-x86_64-20180531.exe 注意:1.msys2不可以安装在FAT*分区 ...

osc_dv39i788
02/07
28
0
notpad++ 搭配 gcc

notpad++ 搭配 gcc GCC 是 GNU 编译器套装的简称(GNU Compiler Collection),一套编程语言编译器,以 GPL 及 LGPL 许可证所发行的自由软件,也是 GNU 项目的关键部分,也是 GNU 工具链的主...

osc_z72b6ak2
2019/01/24
6
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周五乱弹 —— 头发和不要头发,你总要选一个

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @薛定谔的兄弟 :分享洛神有语创建的歌单「我喜欢的音乐」: 《雾 缀じた街 ふたつのかげ》- Porkkana 手机党少年们想听歌,请使劲儿戳(这里)...

小小编辑
9分钟前
17
0
一道 算法题 引发的 ‘xx现场’

请 熟悉的语言 去 验证 在输入框中输入的是否是一个正确的网址 初次读题萌新有点 不知所措的样子一查 MDN 吓一跳 ----- 一个不怎么熟悉的方法跳出眼边URL() 构造函数返回一个新创建的 ...

酒窝yun过去了
17分钟前
0
0
如何检查jQuery中是否已选中复选框? - How to check whether a checkbox is checked in jQuery?

问题: I need to check the checked property of a checkbox and perform an action based on the checked property using jQuery. 我需要检查复选框的checked属性,并使用jQuery根据check......

技术盛宴
19分钟前
12
0
mongoose 使用

http://www.mongoosejs.net/ 编写MongoDB验证,转换和业务逻辑是非常麻烦的. 所以Mongoose应运而生了. const mongoose = require('mongoose');mongoose.connect('mongodb://localhost/te......

东东笔记
25分钟前
10
0
微服务

什么是微服务? 使用一套小服务来开发单个应用的方式,每个服务运行在独立的进程里,一般采用轻量级的通讯机制互联,并且他们可以通过自动化的方式部署。 微服务的特征 单一职责 轻量级通信 ...

鸿FW
49分钟前
23
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部