文档章节

Mingw静态编译go-sqlite3包

棋有此理
 棋有此理
发布于 2012/10/11 22:03
字数 1356
阅读 2685
收藏 6
点赞 0
评论 8

    在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
eclipse3.4 + MinDW-5.1.4 c/c++开发环境配置(完整)

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

曾赛
2010/04/27
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.7.2+cdt+mingw

开发环境 1、 MinGW 下载并安装(参考: http://blog.csdn.net/hemingwang0902/article/details/6889595) MinGW是指只用自由软件来生成纯粹的Win32可执行文件的编译环境,它是Minimalist GN...

lanfogz
2014/10/02
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
【转】Msys/MinGW与Cygwin/gcc

一 MinGW MinGW 官方网站为 http://www.mingw.org/ MinGW,即 Minimalist GNU For Windows(GCC compiler suite)。它是一些头文件和端口库的集合,该集合允许人们在没有第三方动态链接库的情...

mj4738
2012/01/21
0
1
OpenCV使用CMake和MinGW的编译安装及其在Qt配置运行

软件环境 Windows-10-64bit Qt-5.9.3 MinGW-5.3.0-32bit CMake-3.9.2 OpenCV-3.3.1 / 3.4.1(适用) 编译好的 OpenCV(MinGW 版): Github . huihut/OpenCV-MinGW-Build OpenCV 的 MSVC 版及 ......

数据为王
05/21
0
0
yasm汇编器在MinGW下编译不依赖libintl动态链接库的方法

备忘录: 下载了yasm-1.2.0的源码,想自己编译试试,以前没有过编译开源软件的经验,摸索了好长时间。一开始用:./configure --prefix=/usr/local/yasm命令,然后make,是会编译链接成功,问...

娱乐你我
2012/09/21
0
0
win上傻瓜化安装Qt开发环境

win上傻瓜化安装Qt开发环境 古老的MSYS搭建的开发环境不仅存在一些兼容性问题,而且还很繁琐,幸好mingw-build项目的开发者又做了更进一步的改进,他们开发了MSYS2项目。这个项目不仅兼容性更...

panda1986_meng
2014/02/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

vue-router懒加载

1. vue-router懒加载定义 当路由被访问的时候才加载对应组件 2. vue-router懒加载作用 当构建的项目比较大的时候,懒加载可以分割代码块,提高页面的初始加载效率。 ###3. vue-router懒加载实...

不负好时光
5分钟前
0
0
庆祝法国队夺冠:用Python放一场烟花秀

天天敲代码的朋友,有没有想过代码也可以变得很酷炫又浪漫?今天就教大家用Python模拟出绽放的烟花庆祝昨晚法国队夺冠,工作之余也可以随时让程序为自己放一场烟花秀。 这个有趣的小项目并不...

猫咪编程
6分钟前
0
0
SpringBoot | 第七章:过滤器、监听器、拦截器

前言 在实际开发过程中,经常会碰见一些比如系统启动初始化信息、统计在线人数、在线用户数、过滤敏高词汇、访问权限控制(URL级别)等业务需求。这些对于业务来说一般上是无关的,业务方是无需...

oKong
20分钟前
4
0
存储结构分四类:顺序存储、链接存储、索引存储 和 散列存储

存储结构分四类:顺序存储、链接存储、索引存储 和 散列存储 存储结构分四类:顺序存储、链接存储、索引存储 和 散列存储。 顺序结构和链接结构适用在内存结构中。 顺序表每个单元都是按物理...

DannyCoder
31分钟前
0
0
Firefox 61已经为Ubuntu 提供支持

最新和最好的Mozilla Firefox 61 “Quantum”网络浏览器已经为Ubuntu Linux操作系统的用户提供了支持,现在可以通过官方软件库进行更新。 Mozilla于2018年6月26日发布了Firefox 61版本,该版...

六库科技
57分钟前
0
0
Win10升级后执行系统封装(Sysprep)报错

开始封装 一年多以前开始给公司封装Win10系统,便于统一给公司电脑初始化携带各种软件的系统,致力于装完既可以开发的状态。那时候最新的版本是Win10 1703版本,自然就以他为母盘,然后结合V...

lyunweb
今天
39
0
php 性能优化

#什么情况下会遇到性能问题 PHP 语法使用的不恰当

to_be_better
今天
0
0
Jenkins 构建触发器操作详解

前言 跑自动化用例每次用手工点击jenkins出发自动化用例太麻烦了,我们希望能每天固定时间跑,这样就不用管了,坐等收测试报告结果就行。 一、定时构建语法 * * * * * (五颗星,中间用空格隔...

覃光林
今天
0
0
IDEA配置技巧

超详细设置Idea类注释模板和方法注释模板 idea去掉注解param下划线 JetBrains全系列破解

AK灬
今天
0
0
rsync通过服务同步/Linux系统日志/screen工具

rsync通过服务同步 分为服务端(机器A) 和客户端(机器B) 机器A操作编辑/etc/rsyncd.conf配置文件 [root@yolks1 ~]# vim /etc/rsyncd.conf 文件中添加以下配置 port=873 ...

Hi_Yolks
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部