sqlite 3.7.17 FreeBSD下的编译错误
StackOverflow的许多用户建议我迁移到SQlite,所以,我正在尝试,但无法在FreeBSD下编译sqlite3源代码。出现以下错误:sqlite 3.7.17 FreeBSD下的编译错误,sqlite,gcc,freebsd,Sqlite,Gcc,Freebsd,StackOverflow的许多用户建议我迁移到SQlite,所以,我正在尝试,但无法在FreeBSD下编译sqlite3源代码。出现以下错误: sqlite3.c:23527:错误:“fchmod”未在此处声明(不在函数中) 系统: FreeBSD 8.2-RELEASE gcc 4.2.1 有人能提供意见或建议吗 另外,我无法更新系统,因为它是一个正常工作的服务器。Yasir是正确的,您应该使用您需要的所有已移植软件的端口。如果您不是自己管理服务器,您应该能够要求管理员为您安装databas
sqlite3.c:23527:错误:“fchmod”未在此处声明(不在函数中)
系统:
FreeBSD 8.2-RELEASE
gcc 4.2.1
有人能提供意见或建议吗
另外,我无法更新系统,因为它是一个正常工作的服务器。Yasir是正确的,您应该使用您需要的所有已移植软件的端口。如果您不是自己管理服务器,您应该能够要求管理员为您安装databases/sqlite3端口 回到您的实际问题,很难知道为什么在您的案例中没有声明fchmod——它是在
中声明的。也许,您正在使用在一个平台(Linux?)上生成的Makefile在另一个平台(FreeBSD)上构建sqlite?您不应该这样做——配置需要在本地运行
但是,再次强调,不要自己建造它…
man fchmod
显示:
NAME
chmod, fchmod, lchmod — change mode of file
LIBRARY
Standard C Library (libc, -lc)
SYNOPSIS
#include <sys/stat.h>
名称
chmod、fchmod、lchmod-更改文件模式
图书馆
标准C库(libc,-lc)
提要
#包括
因此,您至少需要将
#include
添加到失败文件(sqlite3.c
)的顶部。可能有更好的头文件来包含它。您甚至可能会发现它已经存在了,但是被一个#ifdef
隔离了,在SCO OpenServer 5.0.7
上为sqlite3 3.33.0
解决了这个相同的构建错误(不同的行号)之后,a修复所涉及的代码片段就在OpenBSD上提到fchmod()的注释附近。假定FreeBSD
可能类似于OpenBSD
,可能是因为没有定义\XOPEN\u 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 ******************/
及
使用OpenBSD
源代码的建议是有效的,因为这些源代码将被修补以解决特定于平台的构建问题。这个答案提供了一个可能的根本原因的潜在链接,因为这个Q/a是在一个搜索中出现的,涉及到解决一个与问题中几乎相同的错误消息
在SCO OpenServer 5.0.7
案例中,与此问题无关,但由于此答案中提到了它,并且可能会在其他人的搜索结果中出现,因此在我的案例中,问题是相反的情况,\u XOPEN\u 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
编辑:对于此版本的sqlite
,包含的建议很可能是当时的最佳修复方案。对错误消息进行详细搜索,查找此问题原始时间范围内的活动,发现许多其他用户有相同的问题,并得到相同的建议,即在sqlite3.c
mergalization文件中更高的位置合并include语句。,到目前为止,FreeBSD社区维护的SQLite的最新版本是3.7.14.1。那么,如果可以通过以下途径获得,为什么还要手动编译它呢?在FreeBSD中,通常不鼓励手动编译,因为您必须手动解析依赖关系。@Yasirrassanukaev我想将我的程序编译成SQLite。1) 在其他机器上设置、部署和维护此类编译非常简单2)不依赖于系统,只需要编译源代码。
$ 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