所以我试图编译SQLite(使用不同的目标设备,然后通常使用),我得到一个奇怪的警告和错误,我不知道这意味着如何修复它。下面是我尝试从Visual Studio中编译后得到的消息:
4>编译.
4>interop.c
4> sqlite3.c(11857):错误C2220:警告被视为错误-未生成“对象”文件
4> sqlite3.c(11857):警告C4013:“localtime”未定义;假设extern返回int
4> sqlite3.c(11857):警告C4047:“=”:“tm *”与“int”的间接级别不同
4> sqlite3.c(28379):错误C2040:'localtime':“tm *(const time_t *)”与“int()”的间接寻址级别不同
下面是这些行上的代码:
#else
{
struct tm *pTm;
sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER))
pTm = localtime(&t); //Line 11857
y.Y = pTm->tm_year + 1900;
y.M = pTm->tm_mon + 1;
y.D = pTm->tm_mday;
y.h = pTm->tm_hour;
y.m = pTm->tm_min;
y.s = pTm->tm_sec;
sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
}
#endif
还有localtime()的方法定义,它抱怨第28379行和间接寻址:
/*************************************************************************
** This section contains code for WinCE only.
*/
/*
** WindowsCE does not have a localtime() function. So create a
** substitute.
*/
struct tm *__cdecl localtime(const time_t *t)
{ // Line 28379
static struct tm y;
FILETIME uTm, lTm;
SYSTEMTIME pTm;
sqlite3_int64 t64;
t64 = *t;
t64 = (t64 + 11644473600)*10000000;
uTm.dwLowDateTime = (DWORD)(t64 & 0xFFFFFFFF);
uTm.dwHighDateTime= (DWORD)(t64 >> 32);
FileTimeToLocalFileTime(&uTm,&lTm);
FileTimeToSystemTime(&lTm,&pTm);
y.tm_year = pTm.wYear - 1900;
y.tm_mon = pTm.wMonth - 1;
y.tm_wday = pTm.wDayOfWeek;
y.tm_mday = pTm.wDay;
y.tm_hour = pTm.wHour;
y.tm_min = pTm.wMinute;
y.tm_sec = pTm.wSecond;
return &y;
}
EDIT下面是struct的定义:
struct tm {
int tm_sec; /* seconds after the minute - [0,59] */
int tm_min; /* minutes after the hour - [0,59] */
int tm_hour; /* hours since midnight - [0,23] */
int tm_mday; /* day of the month - [1,31] */
int tm_mon; /* months since January - [0,11] */
int tm_year; /* years since 1900 */
int tm_wday; /* days since Sunday - [0,6] */
int tm_yday; /* days since January 1 - [0,365] */
int tm_isdst; /* daylight savings time flag */
};
我真的不知道“'tm *'在间接级别上与'int'有什么不同”,也不知道如何修复它,我甚至不知道问题是什么,因为这是为Win32编译的,而不是为WinCE编译的。
有没有人了解警告\错误或如何修复它?任何帮助都非常感谢!
谢谢你,谢谢
3条答案
按热度按时间xoshrz7s1#
localtime
函数的声明在使用时不可用。在C规则下,编译器因此假设它是一个返回int的未知函数。然后,它会警告将该int转换为tm*
(这就是“间接级别”的含义)。解决方案是在某个地方声明
localtime
,以便编译器在编译sqlite3.c时可以看到它,比如在该文件包含的头文件中。第二个“间接层”消息(错误)似乎是因为您在使用
localtime
之后才定义它,所以编译器已经猜测签名具有int返回类型,而您的实际签名与此不同。确保
localtime
的正确声明 * 在使用它的点之前 * 可用。简单地说,你需要把线在11857号线之前你可以把定义(函数体)放在任何你想要的地方,只要确保在任何地方使用函数之前声明(函数签名)是已知的。
pw136qt22#
您需要在sqlite3.c中定义
extern
本地时间编译器默认返回与
struct tm
不兼容的int
。k2fxgqgv3#
我在C中得到了同样的错误消息,当我忘记把
#include <stdlib.h>
放在程序的顶部时。新手C错误,但当我把它放在那里,calloc
(这以前造成的错误)开始工作。(Not与您的代码相关,但希望有人在谷歌错误c4047时发现它有用)