C++Builder 5编译SQLite数据库时出现错误求助
嘿,我之前也在C++Builder 5里折腾过SQLite,碰到过一模一样的警告,其实解决起来挺简单的,咱们来捋清楚:
首先说下这个警告的根源:[C++ Warning] shell.c(205): W8065 Call to function '_setmode' with no prototype,本质是编译器不知道_setmode这个函数的原型——它是Windows API里用来设置文件I/O编码模式的函数,但是SQLite的shell.c里没包含声明它的头文件,C++Builder 5的编译器就会抛出这个警告。
给你三个解决思路,按省心程度排序:
最省心的方案:直接移除shell.c
其实shell.c是SQLite自带的命令行客户端代码,如果你只是在自己的程序里用SQLite的数据库读写功能,完全不需要把它加入项目!只保留sqlite3.c、sqlite3.h、sqlite3ext.h这三个文件就够了。删掉shell.c之后,这个警告会直接消失,还能减少项目的编译时间,我当初就是这么解决的。修改shell.c添加头文件
如果你非要保留shell.c(比如想集成命令行功能),打开shell.c,在文件开头的#include区域添加这几个头文件:#include <fcntl.h> #include <sys/stat.h> #include <io.h>_setmode的声明就在<io.h>里,另外两个是关联的依赖头文件,一起加上能避免其他潜在问题。全局声明_setmode函数
要是不想修改SQLite的源文件,怕后续更新sqlite-amalgamation时还要重复改,可以在项目的全局头文件(或者MainForm的头文件最顶部)添加这个函数的声明:#ifdef __cplusplus extern "C" { #endif int _setmode(int fd, int mode); #ifdef __cplusplus } #endif这样编译器就知道
_setmode的原型了,不会再抛出警告。
内容的提问来源于stack exchange,提问作者Laz22434

