Windows平台下使用TCC编译sqlite

2026年3月30日 0 By Majjcom

准备好完整的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