如何在 Delphi 中静态链接 SQLite

搞了我几个小时,终于成功在 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
    声明的函数参数不匹配

时间: 2024-08-28 21:34:17

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

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

上次写了如何在VC6.0下对Delphi写的COM进行调用,原本想马上写如何在Delphi中调用VC6.0开发的COM时,由于在写事例程序中碰到了个很怪的问题,在我机子上用VC写的接口程序编译能通过.但是调用就会出现问题,(在VC下调用也是一样的出现).但是用Delphi写的接口程序编译后,不管是在VC下还是在Delphi下调用都没有问题.后来我把VC开发的接口程序编译后,拷贝到其它机子上试,怪事,完全没有问题了.总结后才知道是我机子有点问题.我到现在还没有解决为什么在我的机子上不行,在其它机子

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

如何在Delphi 中使用 DevExpressVCL的 CxGrid与CxTreeList,编辑某列后计算另一列的值:比如 输入 单价,数量,计算金额. 参考: 1.  输入 单价,数量,计算金额   http://www.360doc.com/content/13/1212/19/3827427_336665778.shtml 重点是:设置Column 的属性值(Properties),响应事件:cxGridDbTableViewColumnPropertiesChange 获得列的值的方法

在Delphi中静态调用DLL 引用外部Dll External Dll 导入Dll

  调用一个DLL比写一个DLL要容易一些.首先给大家介绍的是静态调用方法,稍后将介绍动态调用方法,并就两种方法做一个比较.同样的,我们先举一个静态调用的例子. unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; Button1: TButton;

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

VS2017也推出很久了,在单位的时候写linux的服务端程序只能用vim,这让用惯了IDE的我很难受. 加上想自己撸一套linux上的轮子,决定用VS开工远程编写调试linux程序. 在windows下编写静态库并在另一个项目中引用很简单 新建项目的时候选择静态库,进去把代码撸好,即可编译出静态库*.lib 随后在希望使用该静态库的项目中设置一下链接器"附加库目录"为"../Debug"(和你的输出路径有关),然后添加"附加依赖项"静态库名.l

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

动态链接库是一个能够被应用程序和其它的DLL调用的过程和函数的集合体,它里面包含的是公共代码或资源.由于DLL代码使用了内存共享技术,在某些地方windows也给了DLL一些更高的权限,因而DLL中可以实现一些一般程序所不能实现的功能,如实现windows的HOOK.ISAPI等.同时,DLL还为不同语言间代码共享提供了一条方便的途径.因而DLL在编程时应用较为广泛,本文将介绍如何在 Delphi 中建立和使用DLL. 一.DLL 库内存共享机制 从使用效果看,DLL和unit 很像,它们都可以

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

摘要:本文主要介绍如何在Delphi中使用SSL协议.一共分为七个部分:(1)SSL协议是什么?(2)Delphi中如何使用SSL协议?(3)SSL客户端编程实例.(4)SSL服务端编程实例.(5)SSL证书编程实例.(6)中间人欺骗实例.(7)其它.本文作者同时有一个用SSL协议编写的作品叫SSLPROXY,感兴趣的读者可以从作者主页http://www.138soft.org下载. 一:SSL协议是什么?  SSL是一种加密传输协议.引用网上一段话:SSL 是Secure socket La

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

摘要:本文主要介绍如何在Delphi中使用SSL协议.一共分为七个部分:(1)SSL协议是什么?(2)Delphi中如何使用SSL协议?(3)SSL客户端编程实例.(4)SSL服务端编程实例.(5)SSL证书编程实例.(6)中间人欺骗实例.(7)其它.本文作者同时有一个用SSL协议编写的作品叫SSLPROXY,感兴趣的读者可以从作者主页http://www.138soft.org下载. 一:SSL协议是什么?  SSL是一种加密传输协议.引用网上一段话:SSL 是Secure socket La

VS2010中如何将动态链接库改成静态链接库

VS2010中如何将动态链接库改成静态链接库 VS2010静态编译生成的.exe可执行文件,可以免安装免DLL在其他电脑直接运行. 静态编译:就是在编译可执行文件的时候,将可执行文件需要调用的对应动态链接库(.so)中的部分提取出来,链接到可执行文件中去,使可执行文件在运行的时候不依赖动态链接库. 1. 编译实现方式有两种 [1]debug方式的静态链接: 设置: (1)项目 -> 配置属性->常规->MFC的使用:在静态库中使用MFC(如果有使用MFC). (2)项目 -> 配置

C++中的动态链接库和静态链接库

转自 作者:吴秦出处:http://www.cnblogs.com/skynet/ 这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学,推荐一本书<程序员的自我修养--链接.装载与库>. 什么是库 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说库是一种可执行代码的二进制形式