ODB(C++ ORM)用Mingw的完整编译过程
用mingw官方的GCC4.7.2编译libodb后,并用odb compiler对hello示例生成odb的"包裹"代码,编译链接总是不能通过,下面是编译example/hello报错的信息如下:
libodb-sqlite-2.3.0/odb/sqlite -o driver.exe driver.o person-odb.o -lodb-sqlite -lboost_date_time -lboost_system -lodb
libtool: link: g++ -I/d/odb-sqlite/sqlite-amalgamation-3080200 -mthreads -o .libs/driver.exe driver.o person-odb.o -L/d/odb-sqlite/sqlite-amalgamation-3080200 -L/d/odb-sqlite/libodb-2.3.0/odb -L/d/odb-sqlite/libodb-sqlite-2.3.0/odb/sqlite /d/odb-sqlite/libodb-sqlite-2.3.0/odb/sqlite/.libs/libodb-sqlite.a -lsqlite3 -lboost_date_time -lboost_system /d/odb-sqlite/libodb-2.3.0/odb/.libs/libodb.dll.a -mthreads -L/usr/local/lib
driver.o:driver.cxx:(.text$_ZN3odb6sqlite11query_paramC2EPKv[__ZN3odb6sqlite11qu
ery_paramC2EPKv]+0x1b): undefined reference to `_imp___ZTVN3odb6sqlite11query_pa
ramE'
driver.o:driver.cxx:(.text$_ZN3odb6sqlite10query_baseC1EPKcS3_[__ZN3odb6sqlite10
query_baseC1EPKcS3_]+0x5f): undefined reference to `_imp___ZN3odb6sqlite10query_
base6appendEPKcS3_'
d:/lbe/mingw/bin/../lib/gcc/mingw32/4.7.2/../../../../mingw32/bin/ld.exe: driver
.o: bad reloc address 0x5f in section `.text$_ZN3odb6sqlite10query_baseC1EPKcS3_
[__ZN3odb6sqlite10query_baseC1EPKcS3_]'
collect2.exe: error: ld returned 1 exit status
make[1]: *** [driver.exe] Error 1
make[1]: Leaving directory `/d/lbe/oscode/odb-sqlite/odb-examples-2.3.0/hello'
make: *** [all] Error 2
尝试多种方法不能解决,发现在odb compiler目录中自带一个mingw编译器,这个编译版本是GCC4.7.3的,gcc -v的输出信息如下:
Using built-in specs.
COLLECT_GCC=D:\wxwidgets\wxcode\odb-2.3.0-i686-windows\mingw\bin\gcc
.exe
COLLECT_LTO_WRAPPER=d:/wxwidgets/wxcode/odb-2.3.0-i686-windows/mingw
/bin/../libexec/gcc/i686-w64-mingw32/4.7.3/lto-wrapper.exe
Target: i686-w64-mingw32
Configured with: ../gcc/configure --host i686-w64-mingw32 --target i686-w64-ming
w32 --prefix=/mingw --with-sysroot=/mingw --enable-languages=c,c++ --enable-shar
ed --enable-threads=posix --disable-libssp --disable-libgomp --disable-graphite
--disable-multilib --enable-libstdcxx-time --enable-fully-dynamic-string --disab
le-dw2-exceptions --enable-sjlj-exceptions --disable-libstdcxx-pch --disable-lib
stdcxx-debug --disable-rpath --disable-win32-registry --disable-nls --disable-we
rror --with-pkgversion='ODB special' --with-bugurl=http://www.codesynthesis.com/
products/odb/ --enable-static-plugin --with-stage1-libs=libplugin-stub.a CFLAGS=
-O2 CXXFLAGS=-O2 LDFLAGS=-s
Thread model: posix
gcc version 4.7.3 20130209 (prerelease) (ODB special)
?
而Mingw GCC4.7.2的gcc -v的输出信息如下:
Using built-in specs.
COLLECT_GCC=d:\mingw\bin\gcc.exe
COLLECT_LTO_WRAPPER=d:/mingw/bin/../libexec/gcc/mingw32/4.7.2/lto-wrapper.ex
e
Target: mingw32
Configured with: ../gcc-4.7.2/configure --enable-languages=c,c++,ada,fortran,obj
c,obj-c++ --disable-sjlj-exceptions --with-dwarf2 --enable-shared --enable-libgo
mp --disable-win32-registry --enable-libstdcxx-debug --disable-build-poststage1-
with-cxx --enable-version-specific-runtime-libs --build=mingw32 --prefix=/mingw
Thread model: win32
gcc version 4.7.2 (GCC)
现在则使用odb compiler自带的mingw完成所有的编译链接过程,并记录编译的所有过程,
步骤是:
(1)编译sqlite
gcc -c sqlite3.c
ar crvs libsqlite3.a sqlite3.o
(2)编译libodb
./configure & make 即可
(3)编译libodb-sqlite
./configure CXXFLAGS=-I/d/odb-sqlite/sqlite-amalgamation-3080200 LDFLAGS=-L/d/odb-sqlite/sqlite-amalgamation-3080200 --with-libodb=/d/odb-sqlite/libodb-2.3.0
(4)编译libodb-example
./configure CXXFLAGS=-I/d/odb-sqlite/sqlite-amalgamation-3080200 LDFLAGS=-L/d/odb-sqlite/sqlite-amalgamation-3080200 --with-libodb=/d/odb-sqlite/libodb-2.3.0 ODB=/d/odb-2.3.0-i686-windows/bin/odb.exe --with-database=sqlite --with-libodb-sqlite=/d/odb-sqlite/libodb-sqlite-2.3.0
make
在example/hello下启动测试的程序,并用SqliteAdmin这个软件查看数据库文件中的数据,是正确的.
$ ./driver --database hello.db --create
Hello, John Doe!
Hello, Jane Doe!
count : 3
min age: 31
max age: 33
ODB(C++ ORM)用Mingw的完整编译过程的更多相关文章
- C语言的编译过程、安装gcc编译器以及设置环境变量
以我对C语言编译过程的了解,我用了一点时间画了一个图,提供给大家参考一下,希望有些能对您的问题提上帮助. 前几天刚初步学习了C语言的编译过程,感触挺深的.在C语言中头文件其实起了一个很大的作用. 1. ...
- [译]C++, Java和C#的编译过程解析
1.1.1 摘要 我们知道计算机不能直接理解高级语言,它只能理解机器语言,所以我们必须要把高级语言翻译成机器语言,这样计算机才能执行高级语言编写的程序,在接下来的博文中,我们将介绍非托管和托管语音的编 ...
- (四) openwrt单个ipk编译过程
Tags : Makefile 本周是成胖子每周一博的第五周. 更好的阅读体验,请点击这里 [TOC] 前言 前一篇博客中,我们已经知道整个openwrt的编译顺序,本文我们来探讨与开发者息息相关的单 ...
- (二)我的Makefile学习冲动&&编译过程概述
前言 一 年轻的冲动 二 学习曲线 1 Makefile基本语法 2 bash基础 3 world 三 编译过程概述 1 主机预装工具 2 编译host工具 3 编译交叉工具链 4 编译内核模块 5 ...
- 搭建OpenWrt开发环境(包括编译过程)
OpenWrt是一个高度模块化.高度自动化的嵌入式linux发行版,其编译和安装过程比普通的linux发行版而言,要简单太多了.如果您是新手,您那恐惧的心大可放到肚子里,呵呵.对于新手来说最麻烦的恐怕 ...
- Ubuntu 14.04 LTS 下 android 2.3.5 源码编译过程
Ubuntu 14.04 LTS 下 android 2.3.5 源码编译过程 在新的Ubuntu 64位系统下去编译早期的安卓源码是会出现很多问题的,因为64位系统在安装完成后,很多32位的兼容 ...
- C/C++, Java和C#的编译过程解析
原文地址:http://www.cnblogs.com/rush/p/3155665.html 1.1.1 摘要 我们知道计算机不能直接理解高级语言,它只能理解机器语言,所以我们必须要把高级语言翻译成 ...
- .NET 代码编译过程
作为一种代码指令平台,Microsoft .NET比微软公司先前推出的其他技术平台要来得更为复杂.由于.NET提供了对多种编程语言以及(在理论上说)多重平台的支持,这就需要在传统的两个代 码层添加一个 ...
- Linux C程序的编译过程
Linux C程序的编译过程 学习一门语言程序,本人觉得还是得学习它的编译规则,现在,通过小例子小结下自己对C编译的认识. /*test.c 了解C程序的编译*/ #include <s ...
随机推荐
- django+uwsgi+nginx部署(非常详细)
django+uwsgi+nginx部署 1.介绍: 在网上看了很多教程,但自己部署了很久都没有成功,这篇博文记录自己所踩过得坑. 2.环境: Ubuntu 16.04.1 LTS (GNU/Linu ...
- Centos7 静态IP配置
先将虚拟机设置为桥接模式: 虚拟机网络将VMnet8设置为NAT模式: 查看本机IP地址,ipconfig,记住ipv4地址和默认网关地址,等会配置的时候要用 启动Centos,进入终端模式,设置IP ...
- 初学数位DP
所谓数位dp,字面意思就是在数位上进行dp,数位的含义:一个数有个位.十位.百位.千位.等等,数的每一位就是数位. 数位DP一般应用于: 求出给定区间[A,B]内,符合条件P[i]的数 i 的个数. ...
- 集训第四周(高效算法设计)M题 (扫描法)
原题:UVA11078 题意:给你一个数组,设a[],求一个m=a[i]-a[j],m越大越好,而且i必须小于j 怎么求?排序?要求i小于j呢.枚举?只能说超时无上限.所以遍历一遍数组,设第一个被减数 ...
- python接口测试之序列化与反序列化(四)
在python中,序列化可以理解为:把python的对象编码转换为json格式的字符串,反序列化可以理解为:把json格式 字符串解码为python数据对象.在python的标准库中,专门提供了jso ...
- java成员变量
成员变量是在类范围内定义的变量 局部变量是在一个方法内定义的变量 https://www.cnblogs.com/zhengchenhui/p/5762966.html
- 完美解决了span的宽度设置
下 面代码的CSS定义完美解决了span的宽度设置问题.由于浏览器通常对不支持的CSS属性采取忽略处理的态度,所以最好将display:inline -block行写在后面,这样在Firefox里面, ...
- [codevs3044][POJ1151]矩形面积求并
[codevs3044][POJ1151]矩形面积求并 试题描述 输入n个矩形,求他们总共占地面积(也就是求一下面积的并) 输入 可能有多组数据,读到n=0为止(不超过15组) 每组数据第一行一个数n ...
- idea使用之maven中央仓库索引更新
接着上篇,上篇是更新本地已有的索引,这样在编写pom文件的时候,可以自动提示,但如果我们能够把整个中央仓库的索引更新下来,那不是更方便啦. 打开settings-->Build,Executio ...
- Android GIS开发系列-- 入门季(14)FeatureLayer之范围查询
Android GIS开发系列-- 入门季(5),这篇文章中,我们知道如何去查找要素.现在有一个需求,查找某点5000米范围的要素,那如何来做呢?首先我们需要在地图上画个5000米半径的圆,然后根据Q ...