Windows平台下使用TCC编译sqlite
2026年3月30日准备好完整的Windows头文件。
修改tcc的lib目录下的kernal32.def,添加以下函数定义:
GetSystemTimePreciseAsFileTime
此外还需要创建额外源码:
创建_wfindfirst64i32.c,添加以下内容:
#include <io.h>
#include <string.h>
intptr_t __cdecl _wfindfirst64i32(const wchar_t *_Filename,struct _wfinddata64i32_t *_FindData)
{
struct _wfinddata64_t fd;
intptr_t ret = _wfindfirst64(_Filename,&fd);
if (ret == -1) {
memset(_FindData,0,sizeof(struct _wfinddata64i32_t));
return -1;
}
_FindData->attrib=fd.attrib;
_FindData->time_create=fd.time_create;
_FindData->time_access=fd.time_access;
_FindData->time_write=fd.time_write;
_FindData->size=(_fsize_t) fd.size;
memcpy(_FindData->name,fd.name,260*sizeof(wchar_t));
return ret;
}
创建_wfindnext64i32.c,添加以下内容:
#include <io.h>
#include <string.h>
int __cdecl _wfindnext64i32(intptr_t _FindHandle,struct _wfinddata64i32_t *_FindData)
{
struct _wfinddata64_t fd;
int ret = _wfindnext64(_FindHandle,&fd);
if (ret == -1) {
memset(_FindData,0,sizeof(struct _wfinddata64i32_t));
return -1;
}
_FindData->attrib=fd.attrib;
_FindData->time_create=fd.time_create;
_FindData->time_access=fd.time_access;
_FindData->time_write=fd.time_write;
_FindData->size=(_fsize_t) fd.size;
memcpy(_FindData->name,fd.name,260*sizeof(wchar_t));
return ret;
}
由于未知原因,fgetws会出现问题,需要通过SQLITE_USE_W32_FOR_CONSOLE_IO宏让sqlite在Windows上不使用此函数。
最后完整的编译命令如下:
tcc sqlite3.c shell.c _wfindfirst64i32.c _wfindnext64i32.c -D_WIN32 -DSQLITE_USE_W32_FOR_CONSOLE_IO -o sqlite.exe