execvpe 函数的编译器警告

Compiler warnings for execvpe function

我有一个用 c 语言编写的程序,它使用 execvpe(3) 函数,并且我设置了一行以包含必要的头文件:

#include <unistd.h>

我用下面的命令编译这个文件...

gcc foo.c -o foo

...只得到以下警告:

warning: implicit declaration of function ‘execvpe’ [-Wimplicit-function-declaration]

我在引用 pthread_create(3) 函数的文件中遇到过类似行为。区别显然在于 pthread_create(3) 手册页明确指出应该 "Compile and link with -pthread",exec(3) 系列函数的手册页没有任何此类说明。此外,我在手册或网上找不到任何关于 exec(3) 系列的类似编译器标志的参考。

如果你能提供有关此事的任何信息,我将不胜感激。如果有一些我应该在编译时使用的标志,或者如果我在完全错误的地方寻找解决方案,请告诉我。

手册页here指出必须定义_GNU_SOURCE功能测试宏以启用函数声明:

#define _GNU_SOURCE
#include <unistd.h>

有趣的是,同一手册页上的 link 到 unistd.h 会将您带到一个根本没有声明 execvpe 的实现。您可以检查系统的 unistd.h 文件以检查它是否已声明并依赖于 _GNU_SOURCE - 这是为了在将来解决类似的问题 - 检查 header 内容以查看是否它甚至在那里,它可能依赖于哪些宏。

如果header文件中没有,那么很可能库中也不存在,但您可以按如下方式检查:

#include <unistd.h>
extern int execvpe(const char *file, char *const argv[], char *const envp[]);

这将满足编译器的要求,但如果您随后收到 linker 错误,那么无论如何该函数都不会包含在库中。