1

StackOverflow 的许多用户建议我迁移到 SQlite,因此,我正在尝试但不能在 FreeBSD 下编译 sqlite3 源代码。出现以下错误:

sqlite3.c:23527: error: 'fchmod' undeclared here (not in a function)

系统:

FreeBSD 8.2-RELEASE gcc 4.2.1

任何人都可以提供意见或建议吗?

PS 我无法更新系统,因为它是一个工作服务器。

4

3 回答 3

2

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.

于 2013-07-22T19:15:12.317 回答
1

Yasir 是对的,因为您应该使用您需要的所有已移植软件的端口。如果您不是自己管理服务器,您应该能够要求管理员为您安装数据库/sqlite3 端口。

回到你的实际问题,很难知道为什么 fchmod 没有在你的情况下声明——它是在<sys/stat.h>. 也许,您正在使用在一个平台(Linux?)上生成的 Makefile 在不同的平台(FreeBSD)上构建 sqlite?您不应该这样做—— configure 需要在本地运行。

但是,同样,不要自己构建它......

于 2013-07-22T19:00:01.340 回答
0

在解决了 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合并文件中的更高位置合并包含语句。

于 2020-09-25T18:57:43.410 回答