目录

一、问题

二、解决方案

三、sqlite3_unlock_notify与_sqlite3_unlock_notify

1、__cdecl

2、_cdecl、_stdcall、__fastcall三者之间的区别

四、查看sqlite3.lib和sqlite3.dll

1、sqlite3.lib

2、sqlite3.dll


一、问题

编译odb的libodb-sqlite-2.4.0时,出现了无法链接_sqlite3_unlock_notify函数的问题。

二、解决方案

输入命令cl sqlite3.c -DSQLITE_ENABLE_UNLOCK_NOTIFY -DSQLITE_API=__declspec(dllexport) -link -dll -out:sqlite3.dll

三、sqlite3_unlock_notify与_sqlite3_unlock_notify

出现了无法链接_sqlite3_unlock_notify, 为啥sqlite3_unlock_notify函数名前面要加_?这个就要从调用约定说了。

1、__cdecl

__cdecl的特点
__cdecl 是 C Declaration 的缩写,表示 C 和 C++ 默认的函数调用约定。是C/C++和MFCX的默认调用约定。

按从右至左的顺序压参数入栈、。
由调用者把参数弹出栈。切记:对于传送参数的内存栈是由调用者来维护的,返回值在EAX中。因此对于像printf这样可变参数的函数必须用这种约定。
编译器在编译的时候对这种调用规则的函数生成修饰名的时候,在输出函数名前加上一个下划线前缀,格式为_function。如函数int add(int a, int b)的修饰名是_add。
(1).为了验证参数是从右至左的顺序压栈的,我们可以看下面这段代码,Debug进行单步调试,可以看到我们的调用栈会先进入GetC(),再进入GetB(),最后进入GetA()。

(2).第二点“调用者把参数弹出栈”,这是编译器的工作,暂时没办法验证。要深入了解这部分,需要学习汇编语言相关的知识。

(3).函数的修饰名,这个可以通过对编译出的dll使用VS的”dumpbin /exports ProjectName.dll”命令进行查看(后面章节会进行详细介绍),或直接打开.obj文件查找对应的方法名(如搜索add)。

从代码和程序调试的层面考虑,参数的压栈顺序和栈的清理我们都不用太观注,因为这是编译器的决定的,我们改变不了。但第三点却常常困扰我们,因为如果不弄清楚这点,在多个库之间(如dll、lib、exe)相互调用、依赖时常常出出现莫名其妙的错误。这个我在后面章节会进行详细介绍。

2、_cdecl、_stdcall、__fastcall三者之间的区别

四、查看sqlite3.lib和sqlite3.dll

1、sqlite3.lib

dumpbin /exports sqlite3.lib

2、sqlite3.dll

dumpbin /exports sqlite3.dll

参考:

带你玩转Visual Studio——调用约定__cdecl、__stdcall和__fastcall_luoweifu的博客-CSDN博客___cdecl __stdcall有一定C++开发经验的人一定对”__cdecl、__stdcall、__fastcall”肯定不陌生吧!但你真正理解了吗?是的,我曾在这采了无数个坑,栽了无数个跟头,终于忍无可忍要把它总结一下(虽然我已经有能力解决大部分这种问题了)!什么是调用约定 函数的调用约定,顾名思义就是对函数调用的一个约束和规定(规范),描述了函数参数是怎么传递和由谁清除堆栈的。它决定以下内容:(1)函数参数的压栈顺序,https://blog.csdn.net/luoweifu/article/details/52425733#commentBox

无法链接_sqlite3_unlock_notify函数问题的解决相关推荐

  1. xp系统打不开excel服务器,xp系统下excel表格链接无法点击的解决方法

    在使用excel表格过程中,发现表格中的很多网址链接都无法点击打开.那么,我们该如何将其改成可点击的网址链接,方便快捷的打开网址?接下来,小编就以windowsxp系统为例,给大家分享excel表格链 ...

  2. Button中command后面函数添加参数解决方法

    Button中command后面函数添加参数解决方法 参考文章: (1)Button中command后面函数添加参数解决方法 (2)https://www.cnblogs.com/smart-ziha ...

  3. php war,PHP提示Warning:phpinfo() has been disabled函数禁用的解决方法

    本文实例讲述了PHP提示Warning:phpinfo() has been disabled函数禁用的解决方法.分享给大家供大家参考.具体分析如下: 今天在一朋友服务器测试一个网站时发现我在测试ph ...

  4. macappstore登不上去_Mac 链接不上AppStore的解决方法

    Mac 链接不上AppStore的解决方法 表现为登录时显示:plist parsing error,链接不上Appstore 1.使用活动监视器强制关闭完所有的AppStore的进程. 2.打开终端 ...

  5. php的old函数,laravel单元测试之phpUnit中old()函数报错解决

    php 的 laravel单元测试之phpUnit中old()函数报错解决 前言 最近在做laravel单元测试.遇到了一个问题: 当添加的view里面使用old()函数时就会报错,正常url访问没问 ...

  6. VS使用scanf函数报错解决方法

    VS使用scanf函数报错解决方法 首先来看一段很简单的C语言代码 #include<stdio.h> int main(void) {char s[10];scanf("%s& ...

  7. laravel5.5 __construct函数 无法使用session() 解决方法和实例

    laravel5.5 __construct函数 无法使用session() 解决方法和实例 参考文章: (1)laravel5.5 __construct函数 无法使用session() 解决方法和 ...

  8. Oracle中wm_concat函数报错解决方法

    Oracle中wm_concat函数报错解决方法 参考文章: (1)Oracle中wm_concat函数报错解决方法 (2)https://www.cnblogs.com/52net/archive/ ...

  9. mysql函数 优化_Mysql函数求优化解决思路

    mysql函数求优化 小弟刚开始接触Mysql数据库,需要基于Mysql数据库做报表开发,写的一个函数查询时候效率特别低下. 备注:传进来比较的参数数据量 5W条左右.请高手指教优化方法. 另外,一般 ...

最新文章

  1. centos中用MySQL创建新表_CentOS下使用Shell批量创建数据库表
  2. INFORMIX-4GL实用手册
  3. argparse subparsers()
  4. 在MATLAB中使用tensorflow
  5. 深度学习的实用层面 —— 1.10 梯度消失与梯度爆炸
  6. 免安装版的Mysql安装与配置——详细教程
  7. win10系统word2019如何去掉文字背景颜色方法
  8. 座位安排(seat)
  9. 系统封装教程---之几种常用封装工具和驱动包的简单介绍
  10. 10亿数据导入oracle方案
  11. [Python] 七段数码管绘制
  12. 新手小白入门编程第3讲 JAVA入门案例
  13. 运用自回归滑动平均模型、灰色预测模型、BP神经网络三种模型分别预测全球平均气温,并进行预测精度对比(附代码、数据)
  14. 远程桌面优化避坑指南
  15. 计算机科学与技术专业为什么要学物理,「物理」一定要好的14个大学专业
  16. 如何撰写国内外研究现状
  17. SISO/MIMO信道估计(channel estimation)原理详细图解
  18. 什么是DC,以及CreateCompatibleDC,CreateCompatibleBitmap,SelectObject的作用
  19. Win 7的50个使用小诀窍
  20. Web前端学习(千锋)

热门文章

  1. 2020投资入籍项目排名:圣基茨和尼维斯投资移民项目全球最快批复
  2. 收集:现场救人、抗震救援、灾后心理援助、地震和救灾的常见误区、地震时使用手机报平安办法...
  3. 实现带头结点的单链表元素就地逆置
  4. android摄像头方向与屏方向,Android开发中关于摄像头方向的理解
  5. 学习沐神课程 自用深度学习笔记05 线性回归基础优化算法
  6. MyBatis快速入门(10)全局配置--settings
  7. 基于OneNet平台设计的多节点温度采集系统-有人云4G模块+STM32
  8. 微信清理h5,小程序,公众号缓存
  9. 2021年三季度中国服装家纺行业A股上市企业营收排行榜:海澜之家业绩突出,再度蝉联榜单TOP1(附热榜TOP61详单)
  10. 鸿蒙——通用设计基础(未完待续)