在FreeBSD下的sqlite 3.7.17编译错误

时间:2013-06-18 11:44:08

标签: sqlite gcc freebsd

StackOverflow上有很多用户建议我迁移到SQlite。好的,我正在尝试,但无法在FreeBSD下编译sql源代码。发生以下错误:

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

系统:

FreeBSD 8.2-RELEASE gcc 4.2.1

有任何建议或建议吗?

PS。无法更新系统,其工作服务器。感谢。

3 个答案:

答案 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的注释。假设FreeBSDOpenBSD类似,则可能是因为未定义_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 }}合并文件。