搞了我几个小时,终于成功在 Delphi 中静态链接了

SQLite (v3.5.4),下一步就是研究加密了,呵呵
中间其实遇到很多问题,今天累了,就不说了,改天补上


下载测试工程

下面说说方法

1.当然是下载 SQLite 的源代码啦,呵呵,不过记得要是 all in one 的 amalgamation 版本哦
  (修正: amalgamation 并非 all in one, 只是 core code all in one, 源代码里的其他文件也是不能少的!)
2.解压缩,得到3个文件 sqlite3.c sqlite3.h sqlite3ext.h
  然后把 sqlite3.c 编译成 obj 以便在 Delphi 中使用
  要注意的是不要用 VC 编译,要用 Borland 的 C++ 编译器,比如 Delphi 自带的 bcc
  这主要是因为 VC 编译的 obj 是 COFF 格式的,而 Borland 用的 obj 是 OMF 格式
  bcc 编译的命令行: bcc32 -pc -RT- -O -w- -6 -I(bcc32)\include -c sqlite3.c
3.光有 sqlite3.obj 还不够哦,呵呵,因为 sqlite3.c 有链接其他的库
  这里提供所有要用到的 obj 文件 下载
4.现在所有的 obj 文件都准备好了,不过别高兴的太早了,现在只完成了一小部分而已...
  要在 Delphi 中使用这些 obj 中的函数,必须要先声明一下
  先新建个 Unit, 比如 sqlite3.pas, 然后指定链接的 obj 文件,如
    {$L 'OBJ\sqlite3_5_4.obj'}
    {$L 'OBJ\streams.obj'} //duplicato
    {$L 'OBJ\_ftoul.obj'}
    {$L 'OBJ\files.obj'}
  注意顺序哦,呵呵
  然后添加函数声明
  比如要用到 sqlite3_open 方法,在 sqlite 的源代码里声明是这样的
    SQLITE_API int sqlite3_open(
      const char *filename,   /* Database filename (UTF-8) */
      sqlite3 **ppDb          /* OUT: SQLite db handle */
    );
  在 Delphi 中相应的声明为:
    function _sqlite3_open(dbname: PChar; var db: Pointer): Integer; cdecl; external;
  注意调用方式为 cdecl, 函数名要以 _ 开头,否则会找不到
  只是 sqlite3 函数好多哦,呵呵,所以我才说只完成了部分工作嘛...
5.OK,完成了函数声明才算是全部完成
  现在可以正式使用了~

常见问题:
  1.编译时报 Unsatisfied forward or external declaration
    出现这个错误的原因是声明的函数的找不到
    一般来说是因为链接的 obj 文件不全,或者顺序不对
    还有就是声明的函数名称不对,找不到
  2.编译时报 Internal Error: L3576
    声明的函数参数不匹配

如何在 Delphi 中静态链接 SQLite的更多相关文章

  1. 在Delphi中静态调用DLL

    在Delphi中静态调用DLL top 调用一个DLL比写一个DLL要容易一些.首先给大家介绍的是静态调用方法,稍后将介绍动态调用方法,并就两种方法做一个比较.同样的,我们先举一个静态调用的例子. u ...

  2. 如何在Delphi中调用VC6.0开发的COM

    上次写了如何在VC6.0下对Delphi写的COM进行调用,原本想马上写如何在Delphi中调用VC6.0开发的COM时,由于在写事例程序中碰到了个很怪的问题,在我机子上用VC写的接口程序编译能通过. ...

  3. 如何在Delphi 中使用 DevExpressVCL的 CxGrid与CxTreeList,编辑某列后计算另一列的值

    如何在Delphi 中使用 DevExpressVCL的 CxGrid与CxTreeList,编辑某列后计算另一列的值:比如 输入 单价,数量,计算金额. 参考: 1.  输入 单价,数量,计算金额 ...

  4. VS编译linux项目生成静态库并在另一个项目中静态链接的方法

    VS2017也推出很久了,在单位的时候写linux的服务端程序只能用vim,这让用惯了IDE的我很难受. 加上想自己撸一套linux上的轮子,决定用VS开工远程编写调试linux程序. 在window ...

  5. 实例讲解如何在Delphi中动态创建dxBarManager内容

    一.dxBarManager中一些非常重要的概念: TCategorys:为了方便对dxBarManager中的项目进行归类而设计的一个属性,当然,只使用默认的名字为Default的Category也 ...

  6. [转]Delphi 中动态链接库(dll)的建立和使用

    动态链接库是一个能够被应用程序和其它的DLL调用的过程和函数的集合体,它里面包含的是公共代码或资源.由于DLL代码使用了内存共享技术,在某些地方windows也给了DLL一些更高的权限,因而DLL中可 ...

  7. 谈Delphi中SSL协议的应用(好多相关文章)

    摘要:本文主要介绍如何在Delphi中使用SSL协议.一共分为七个部分:(1)SSL协议是什么?(2)Delphi中如何使用SSL协议?(3)SSL客户端编程实例.(4)SSL服务端编程实例.(5)S ...

  8. 老陈---谈Delphi中SSL协议的应用[转]

    摘要:本文主要介绍如何在Delphi中使用SSL协议.一共分为七个部分:(1)SSL协议是什么?(2)Delphi中如何使用SSL协议?(3)SSL客户端编程实例.(4)SSL服务端编程实例.(5)S ...

  9. linux c静态链接库与动态链接库

    库函数是我们编程的时候经常用到的,我们协作编程的时候可以将常用的函数封装成库供大家使用,这样能够提高大家的工作效率.对于库函数,它分为动态链接库和静态链接库.对于静态链接库我们必须是连接到可执行文件中 ...

随机推荐

  1. Xen启动过程分析(还是分享过来吧,找了好长时间)

    XEN启动过程     ‍Xen Hypervisor运行在Ring0,在启动过程中,Xen首先被引导:系统由Grub启动,遵循Multiboot引导规范:然后Linux内核做为module也被引导入 ...

  2. 用javascript简单封装AJAX

    1.创建一个AJAX引擎对象 var CreateAjax = function () { var xhr = null; if (window.XMLHttpRequest) { //非IE游览器 ...

  3. 安卓--界面--改变image view

    switch (v.getId()) { case R.id.button: imageView.setImageResource(R.drawable.jelly_bean); break; def ...

  4. java集合类的学习(二)

    ArrayList,LinkedList,Vector都是List的实现类,前两都没有实现同步机制,Vector实现了同步机制.他们代码类似. ArrayList代表大小可变的数组,允许对元素进行快速 ...

  5. 自动化工具selenium

    selenium web 自动化工具 selenium 不仅仅可以做web自动化,还可以考虑用于爬虫 java.python..net都可使用,具体使用方法google 构建Python+Seleni ...

  6. VIm 一些常用的设置

    一些常用的vim设置   以下内容皆来源于网络,感谢原作者.如果引用出处错误,请告知以便修改. 1. vim的几种模式和按键映射 转载自:[1] Map是Vim强大的一个重要原因,可以自定义各种快捷键 ...

  7. window 下如何安装ghost博客

    1.安装nodejs # Node v0.12.x and v4.2+ LTS - supported 我本地安装的是4.2 安装其他版本可能提示系统不兼容 2.安装mysql 3.安装bower 4 ...

  8. [Android Studio] *.jar 与 *.aar 的生成与*.aar导入项目方法

    主要讲解Android Studio中生成aar文件以及本地方式使用aar文件的方法. 在Android Studio中对一个自己库进行生成操作时将会同时生成*.jar与*.aar文件. 分别存储位置 ...

  9. bootstrap 之 xs,sm,md,lg && 主要颜色

    mobile – xs ( <768px ) tablet – sm ( 768~991px ) desktop – md ( 992~1170px ) large desktop – lg ( ...

  10. 实现TabelView的多个cell布局

    - (void)viewDidLoad { [super viewDidLoad]; self.LabelArray=[[NSMutableArray alloc]initWithObjects:@& ...