C mmap标志&x2018;地图(固定)无替代(x2019);;即使使用受支持的内核也未声明

C mmap标志&x2018;地图(固定)无替代(x2019);;即使使用受支持的内核也未声明,c,linux-kernel,mmap,C,Linux Kernel,Mmap,我正在尝试构建一个使用MAP\u FIXED\u NOREPLACEmmap标志的应用程序。从外观上看,该标志似乎是从linux内核4.17开始支持的。我目前在我的Ubuntu 18.04.5系统上安装了5.4.0-53-generic。尝试构建应用程序时,出现以下错误: cc -MD -c -o ../nondebug/libpmemblk/set.o -std=gnu99 -Wall -Werror -Wmissing-prototypes -Wpointer-arith -Wsign-co

我正在尝试构建一个使用
MAP\u FIXED\u NOREPLACE
mmap标志的应用程序。从外观上看,该标志似乎是从linux内核4.17开始支持的。我目前在我的Ubuntu 18.04.5系统上安装了
5.4.0-53-generic
。尝试构建应用程序时,出现以下错误:

cc -MD -c -o ../nondebug/libpmemblk/set.o -std=gnu99 -Wall -Werror -Wmissing-prototypes -Wpointer-arith -Wsign-conversion -Wsign-compare -Wconversion -Wunused-macros -Wmissing-field-initializers -Wfloat-equal -Wswitch-default -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -std=gnu99 -fno-common -pthread -DSRCVERSION=\"1.6+git703.g8cb972fe3\" -DSDS_ENABLED     -I../include -I../common/  -fPIC  ../../src/../src/common/set.c
../../src/../src/common/set.c: In function ‘util_replica_map_local_addr’:
../../src/../src/common/set.c:2661:13: error: ‘MAP_FIXED_NOREPLACE’ undeclared (first use in this function); did you mean ‘_IOS_NOREPLACE’?
     flags | MAP_FIXED_NOREPLACE, 0) != 0) {
             ^~~~~~~~~~~~~~~~~~~
             _IOS_NOREPLACE
../../src/../src/common/set.c:2661:13: note: each undeclared identifier is reported only once for each function it appears in
../Makefile.inc:328: recipe for target '../nondebug/libpmemblk/set.o' failed

我检查了,文件
set.c
确实包含
sys/mman.h
mmap所需的头文件。我不知道编译器为什么抱怨
MAP\u FIXED\u NOREPLACE
,以及如何解决这个问题。

尝试在文件的最顶端定义
\GNU SOURCE
,或者在命令行上定义
-D\GNU SOURCE
。手册页没有将
MAP\u FIXED\u NOREPLACE
列为需要此功能的标志之一,但在我的系统标题中,它由与之相同的ifdef控制。我想这是一个文档错误。@NateEldredge
#define\u GNU\u SOURCE
已经位于文件的顶部。您可以尝试跟踪
中的包含链,以找到实际定义宏的文件。对于我来说,在使用glibc 2.31的Ubuntu 20.04上,它位于
/usr/include/bits/mman map flags generic.h
。你可以通过
\include
\ifndef map\u FIXED\u NOREPLACE
\define map\u FIXED\u NOREPLACE 0x100000
\endif
来预测它。GNU库(glibc)中添加了
map\u FIXED\u NOREPLACE>支持版本2.29,所以应该在Ubuntu的“libc6-dev”包版本2.29以后的版本中定义。