在C 头文件中无法链接mremap
我在一个项目里为一些高效数据结构开发一个小型分配器,导入 mremap 时遇到了一些困难。其他的 sys/mman.h 函数,如 mmap 和 munmap,都按预期工作。我按照手册以及其他问题的回答,在包含头文件之前定义了用于测试该函数的宏。我正在使用GCC进行编译,并按照手册使用 -lc 选项来链接libc,同时我也确保更新了系统中的 glibc 包。不过,我仍然收到了一个“implicit declaration”错误,以及把返回值赋给一个 void * 而不是一个 int 的错误。错误信息如下:
In file included from datatypes.h:6,
from login.h:4,
from login.c:10:
shalloc.h: In function 'vecadd':
shalloc.h:58:34: error: implicit declaration of function 'mremap'; did you mean 'munmap'? [-Wimplicit-function-declaration]
58 | void *new_page = mremap(vec, vecsz - 1, vecsz, 0);
| ^~~~~~
| munmap
shalloc.h:58:34: error: initialization of 'void *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
make: *** [Makefile:13: login] Error 1
头文件中相关的几行是:
#define _GNU_SOURCE
#include <sys/mman.h>
__attribute((always_inline))
static inline long vecadd(vector *vec) {
int vecsz = getpagesize() * ++vec->pages;
void *new_page = mremap(vec, vecsz - 1, vecsz, 0);
if (new_page == MAP_FAILED) {
perror("RESIZING FAILED");
return -1;
}
return ++vec->num;
}
请原谅我对自增运算符的鲁莽使用——希望这些并不太相关,但我想给出一些背景信息。由 make 产生的最终命令是:
gcc -c login.c -o login.o -g -Wall -lc -lsodium -lbsd -p -fsanitize=address
解决方案
这可能是在 #define _GNU_SOURCE 之前还有其他包含时发生的情况。
请确保这个宏在包含任何文件之前最先出现。例如,这会导致对 mremap 的隐式声明警告:
#include <stdio.h>
#include <unistd.h>
#define _GNU_SOURCE
#include <sys/mman.h>
而下面的情况则不会:
#define _GNU_SOURCE
#include <sys/mman.h>
#include <stdio.h>
#include <unistd.h>
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。