StackOverflow 的许多用户建议我迁移到 SQlite,因此,我正在尝试但不能在 FreeBSD 下编译 sqlite3 源代码。出现以下错误:
sqlite3.c:23527: error: 'fchmod' undeclared here (not in a function)
系统:
FreeBSD 8.2-RELEASE
gcc 4.2.1
任何人都可以提供意见或建议吗?
PS 我无法更新系统,因为它是一个工作服务器。
man fchmod
显示:
NAME
chmod, fchmod, lchmod — change mode of file
LIBRARY
Standard C Library (libc, -lc)
SYNOPSIS
#include <sys/stat.h>
因此,您至少需要添加#include <sys/stat.h>
到失败文件 ( ) 的顶部。sqlite3.c
可能有一个更好的头文件可以从中包含它。您甚至可能会发现它已经存在但被#ifdef
.
Yasir 是对的,因为您应该使用您需要的所有已移植软件的端口。如果您不是自己管理服务器,您应该能够要求管理员为您安装数据库/sqlite3 端口。
回到你的实际问题,很难知道为什么 fchmod 没有在你的情况下声明——它是在<sys/stat.h>
. 也许,您正在使用在一个平台(Linux?)上生成的 Makefile 在不同的平台(FreeBSD)上构建 sqlite?您不应该这样做—— configure 需要在本地运行。
但是,同样,不要自己构建它......
在解决了 on 的相同构建错误(不同的行号)sqlite3 3.33.0
之后SCO OpenServer 5.0.7
,a 修复所涉及的代码片段靠近提及fchmod() on OpenBSD
. 假设这FreeBSD
可能类似于OpenBSD
,也许此问题的修复可能是因为_XOPEN_SOURCE
未定义。
/*
** We need to define _XOPEN_SOURCE as follows in order to enable
** recursive mutexes on most Unix systems and fchmod() on OpenBSD.
** But _XOPEN_SOURCE define causes problems for Mac OS X, so omit
** it.
*/
#if !defined(_XOPEN_SOURCE) && !defined(__DARWIN__) && !defined(__APPLE__)
# define _XOPEN_SOURCE 600
#endif
在合并源中,代码在sqliteInt.h
, 之间
/************** End of sqliteLimit.h *****************************************/
/************** Continuing where we left off in sqliteInt.h ******************/
和
/************** Include hash.h in the middle of sqliteInt.h ******************/
/************** Begin file hash.h ********************************************/
使用OpenBSD
源的建议是有效的,因为这些源将被修补以解决特定于平台的构建问题。此答案提供了可能的根本原因的潜在链接,因为此 Q/A 出现在涉及解决与问题中的错误消息几乎相同的错误消息的搜索中。
在这种SCO OpenServer 5.0.7
情况下,与这个问题无关,但由于它在这个答案中被提及,并且它可能出现在其他人的搜索结果中,所以我的问题是相反的情况,_XOPEN_SOURCE
导致错误并需要一个补丁,如:
$ diff -u sqlite3.c.orig sqlite3.c
--- sqlite3.c.orig 2020-08-14 08:42:52.000000000 -0500
+++ sqlite3.c 2020-10-25 13:38:01.000000000 -0500
@@ -13633,10 +13633,11 @@
/*
** We need to define _XOPEN_SOURCE as follows in order to enable
** recursive mutexes on most Unix systems and fchmod() on OpenBSD.
-** But _XOPEN_SOURCE define causes problems for Mac OS X, so omit
-** it.
+** But _XOPEN_SOURCE define causes problems for Mac OS X, and for
+** SCO OpenServer 5.0.7, so omit it.
*/
-#if !defined(_XOPEN_SOURCE) && !defined(__DARWIN__) && !defined(__APPLE__)
+#if !defined(_XOPEN_SOURCE) && !defined(__DARWIN__) && !defined(__APPLE__) \
+ && !defined(_SCO_DS)
# define _XOPEN_SOURCE 600
#endif
编辑:很可能这个建议#include <sys/stat.h>
是当时这个版本的最佳解决方案sqlite
。详细搜索在该问题的原始时间范围内寻找活动的错误消息,发现许多其他用户有相同的问题并得到相同的建议,即在sqlite3.c
合并文件中的更高位置合并包含语句。