无法链接_sqlite3_unlock_notify函数问题的解决
目录
一、问题
二、解决方案
三、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函数问题的解决相关推荐
- xp系统打不开excel服务器,xp系统下excel表格链接无法点击的解决方法
在使用excel表格过程中,发现表格中的很多网址链接都无法点击打开.那么,我们该如何将其改成可点击的网址链接,方便快捷的打开网址?接下来,小编就以windowsxp系统为例,给大家分享excel表格链 ...
- Button中command后面函数添加参数解决方法
Button中command后面函数添加参数解决方法 参考文章: (1)Button中command后面函数添加参数解决方法 (2)https://www.cnblogs.com/smart-ziha ...
- php war,PHP提示Warning:phpinfo() has been disabled函数禁用的解决方法
本文实例讲述了PHP提示Warning:phpinfo() has been disabled函数禁用的解决方法.分享给大家供大家参考.具体分析如下: 今天在一朋友服务器测试一个网站时发现我在测试ph ...
- macappstore登不上去_Mac 链接不上AppStore的解决方法
Mac 链接不上AppStore的解决方法 表现为登录时显示:plist parsing error,链接不上Appstore 1.使用活动监视器强制关闭完所有的AppStore的进程. 2.打开终端 ...
- php的old函数,laravel单元测试之phpUnit中old()函数报错解决
php 的 laravel单元测试之phpUnit中old()函数报错解决 前言 最近在做laravel单元测试.遇到了一个问题: 当添加的view里面使用old()函数时就会报错,正常url访问没问 ...
- VS使用scanf函数报错解决方法
VS使用scanf函数报错解决方法 首先来看一段很简单的C语言代码 #include<stdio.h> int main(void) {char s[10];scanf("%s& ...
- laravel5.5 __construct函数 无法使用session() 解决方法和实例
laravel5.5 __construct函数 无法使用session() 解决方法和实例 参考文章: (1)laravel5.5 __construct函数 无法使用session() 解决方法和 ...
- Oracle中wm_concat函数报错解决方法
Oracle中wm_concat函数报错解决方法 参考文章: (1)Oracle中wm_concat函数报错解决方法 (2)https://www.cnblogs.com/52net/archive/ ...
- mysql函数 优化_Mysql函数求优化解决思路
mysql函数求优化 小弟刚开始接触Mysql数据库,需要基于Mysql数据库做报表开发,写的一个函数查询时候效率特别低下. 备注:传进来比较的参数数据量 5W条左右.请高手指教优化方法. 另外,一般 ...
最新文章
- centos中用MySQL创建新表_CentOS下使用Shell批量创建数据库表
- INFORMIX-4GL实用手册
- argparse subparsers()
- 在MATLAB中使用tensorflow
- 深度学习的实用层面 —— 1.10 梯度消失与梯度爆炸
- 免安装版的Mysql安装与配置——详细教程
- win10系统word2019如何去掉文字背景颜色方法
- 座位安排(seat)
- 系统封装教程---之几种常用封装工具和驱动包的简单介绍
- 10亿数据导入oracle方案
- [Python] 七段数码管绘制
- 新手小白入门编程第3讲 JAVA入门案例
- 运用自回归滑动平均模型、灰色预测模型、BP神经网络三种模型分别预测全球平均气温,并进行预测精度对比(附代码、数据)
- 远程桌面优化避坑指南
- 计算机科学与技术专业为什么要学物理,「物理」一定要好的14个大学专业
- 如何撰写国内外研究现状
- SISO/MIMO信道估计(channel estimation)原理详细图解
- 什么是DC,以及CreateCompatibleDC,CreateCompatibleBitmap,SelectObject的作用
- Win 7的50个使用小诀窍
- Web前端学习(千锋)
热门文章
- 2020投资入籍项目排名:圣基茨和尼维斯投资移民项目全球最快批复
- 收集:现场救人、抗震救援、灾后心理援助、地震和救灾的常见误区、地震时使用手机报平安办法...
- 实现带头结点的单链表元素就地逆置
- android摄像头方向与屏方向,Android开发中关于摄像头方向的理解
- 学习沐神课程 自用深度学习笔记05 线性回归基础优化算法
- MyBatis快速入门(10)全局配置--settings
- 基于OneNet平台设计的多节点温度采集系统-有人云4G模块+STM32
- 微信清理h5,小程序,公众号缓存
- 2021年三季度中国服装家纺行业A股上市企业营收排行榜:海澜之家业绩突出,再度蝉联榜单TOP1(附热榜TOP61详单)
- 鸿蒙——通用设计基础(未完待续)