数据库加密之Xcode9.0后,sqlcipher加密:Implicit declaration of function ’sqlite3_key‘is invalid in C99问题
来源:互联网 发布:视频同声翻译软件 编辑:程序博客网 时间:2024/06/10 19:16
问题背景
Xcode由8.3.3升级到9.0,原先在Xcode8.3.3能编译并运行成功的项目,在Xcode9.0编译失败,出现如下错误:
在FMDatabase.m中:
前一篇文章讲到sqlcipher数据库加密的配置教程是没有问题的,问题在于Implicit declaration of funciton,字面意思叫隐式声明,我们理解为,在当前文件FMDatabase.m以及它内部#import的文件中,只找到了function的实现,并没有找到头文件和其声明。这是升级Xcode9.0后,C99编译环境导致的。
问题排查
我们可以将这归为一类问题,Implicit declaration of funciton ‘xxx’ is invalid in C99,这类问题的解决办法一般是:
找到这个‘xxx’方法被调用的**.m文件
这里sqlite3_key和sqlite3_rekey是在FMDatabase.m文件中使用
在**.m中找到‘xxx’是引用自哪一个文件
这里sqlite3_key和sqlite3_rekey的声明源自#import < sqlite3.h >
确定‘xxx’方法在这个文件中已经被正确声明
这里sqlite3.h文件存在sqlite3_key和sqlite3_rekey的声明确实存在于sqlcipher/Source/目录下,
但是#import < sqlite3.h >显然无法正确链接到该位置,
按住‘command’,用鼠标点击#import < sqlite3.h > ,Jump to defination,
发现#import < sqlite3.h >链接到了iOS11.0/usr/include/sqlite3.h文件下,而该文件中不存在sqlite3_key和sqlite3_rekey的声明。
至此,我们就找到隐式声明的问题所在了。
解决办法
修改链接路径,使其引用自正确的文件
以本文的问题为例,既然是链接文件出错,那么我们通过修改#import < sqlite3.h > 改为#import < SQLCipher/sqlite3.h > ,让其链接到sqlcipher下的sqlite3.h文件,可以解决这个问题
注意,如果像我们上一篇文章,是通过静态库来配置SQLCipher,是找不到< SQLCipher/sqlite3.h>路径的,我们可以通过强制打破隐式声明的方式解决这个问题,在FMDatabase.m中声明sqlite3_key和sqlite3_rekey:
#if defined(SQLITE_HAS_CODEC)SQLITE_API int sqlite3_key(sqlite3 *db, const void *pKey, int nKey);SQLITE_API int sqlite3_rekey(sqlite3 *db, const void *pKey, int nKey);#endif
- 数据库加密之Xcode9.0后,sqlcipher加密:Implicit declaration of function ’sqlite3_key‘is invalid in C99问题
- xcode9报 Implicit declaration of function 'require' is invalid in c99 的错误
- Implicit declaration of function 'sysctlbyname' is invalid in C99
- error : implicit declaration of function CC_MD5 is invalid in C99
- Implicit Declaration of function 'glBindVertexArrayOES' is invalid in c99
- iOS Implicit declaration of function XXX is invalid in C99”
- Implicit declaration of function 'NSFileTypeForHFSTypeCode' is invalid in C99
- Implicit declaration of function '' is invalid in C99.
- Implicit declaration of function '*****' is invalid in C99
- Implicit declaration of function 'SecItemExport' is invalid in C99
- iOS Implicit declaration of function XXX is invalid in C99”
- Implicit declaration of function 'sysctl' is invalid in C99
- Implicit declaration of function 'NSFileTypeForHFSTypeCode' is invalid in C99
- Implicit declaration of function 'inet_addr' is invalid in C99
- 关于Xcode6编译变更 “Implicit declaration of function 'sysctl' is invalid in C99” 报错问题
- iOS开发Implicit declaration of function 'XXXX' is invalid in C99” 报错问题
- "Implicit declaration of function 'sysctl' is invalid in C99” 报错问题
- C和指针之编译出现warning: implicit declaration of function 'matrix_multiply' is invalid in C99问题
- linux 环境变量设置(临时 + 永久)
- JAVA提高篇(34)-- Java多线程的同步与死锁
- JSON字符串和java对象的互转
- 图片接口回调
- Java中,逻辑与& 和短路与&& 的区别
- 数据库加密之Xcode9.0后,sqlcipher加密:Implicit declaration of function ’sqlite3_key‘is invalid in C99问题
- Java对象的创建、访问和定位
- 【经典算法】:图的深度优先搜索与广度优先搜索的实现
- .net 反射访问私有变量和私有方法
- Animator事件
- PAT乙级题1002.写出这个数
- Popupwindow的简单使用
- 用阿里云独享虚拟主机搭建个人网站
- http客户端开发get、Post两种方式