Delphi -如何在 Delphi 链接 obj 文件

如何在 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 文件,如
{KaTeX parse error: Undefined control sequence: \sqlite at position 7: L 'OBJ\̲s̲q̲l̲i̲t̲e̲3_5_4.obj'} {L ‘OBJ\streams.obj’} //duplicato
{KaTeX parse error: Expected 'EOF', got '}' at position 19: …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 连接 c++ builder 生成obj文件
delphi 可以连接c++ builder 生成OMF格式的obj文件,会报一个错。[DCC Error] E2065 Unsatisfied forward or external declaration: ‘xXXX’
函数名没有找到,在头文件里加一个未公开的参数 #pragma option push -V?- 解决问题。
XE2 版本也可以连接VC 生成 COFF格式的OBJ文件。
命名空间的例子 delphi 版本xe
test.cpp
//如果没有下面的#pragma,加不加下划线都无法链接,而有了下面的#pragma,不需要加下划线即可链接
#pragma option push -V?-
namespace ns1{
int test()
{
return 7;
}
}
bcc32 -pc -RT- -O -w- -6 -I(bcc32)\include -c test.cpp
将生成的test.obj中的 @ns1@test q v 替 换 为 @ n s 1 t e s t qv 替换为@ns1_test qv@ns1testqv
.pas中的代码如下:
{KaTeX parse error: Expected 'EOF', got '}' at position 13: L 'test.obj'}̲ function ns1_t…L ‘test.obj’}
function _test(): Integer; cdecl; external;
procedure TForm2.Button1Click(Sender: TObject);
begin
ShowMessage(inttostr(_test()));
end;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值