StackOverflow上有很多用户建议我迁移到SQlite。好的,我正在尝试,但无法在FreeBSD下编译sql源代码。发生以下错误:
sqlite3.c:23527: error: 'fchmod' undeclared here (not in a function)
系统:
FreeBSD 8.2-RELEASE
gcc 4.2.1
有任何建议或建议吗?
PS。无法更新系统,其工作服务器。感谢。
答案 0 :(得分: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
围起来。
答案 1 :(得分:1)
Yasir是正确的,你应该使用你需要的所有已经移植的软件的端口。如果您不是自己管理服务器,您应该能够要求管理员为您安装数据库/ sqlite3端口。
回到你的实际问题,很难知道为什么fchmod没有在你的情况下声明 - 它在<sys/stat.h>
中声明。也许,您正在使用在一个平台(Linux?)上生成的Makefile来在不同的平台(FreeBSD)上构建sqlite?你不应该这样做 - 配置需要在本地运行。
但是,再次,不要自己构建它......
答案 2 :(得分:0)
在sqlite3 3.33.0
上解决了SCO OpenServer 5.0.7
的相同构建错误(不同的行号)之后,此修复程序所涉及的代码片段靠近提及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
情况下,与该问题无关,但由于此答案中已提及该问题,并且可能会在其他人的搜索结果中出现,因此我的问题是相反的情况,其中{{ 1}}导致了错误,并需要一个补丁,如:
_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>
的建议很可能是当时的最佳解决方案。对错误消息的详细搜索以寻找该问题的原始时间范围内的活动,揭示了许多其他有相同问题并得到相同建议的用户,即将{{1 }}合并文件。