我有一个用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)手册页清楚地表明一个人应该&#34;编译并与-pthread&#34;链接,exec(3)函数族的手册页没有任何这样的指令。此外,我在手册或在线中找不到exec(3)系列的类似编译器标志的任何参考。
我很感激您对此事的任何信息。如果有一些标志我应该在编译时使用,或者如果我正在寻找完全错误的解决方案,请告诉我。
答案 0 :(得分:1)
手册页here指出有必要定义_GNU_SOURCE
特征测试宏以启用函数声明:
#define _GNU_SOURCE
#include <unistd.h>
有趣的是,同一手册页上的unistd.h链接会将您带到一个根本不会声明execvpe
的实现。您可以检查系统的unistd.h文件以检查它是否已声明且依赖于_GNU_SOURCE - 即将来解决类似问题 - 检查标题内容以查看它是否存在甚至是什么可能依赖的宏。
如果它不在头文件中,那么它很可能也不在库中,但您可以检查如下:
#include <unistd.h>
extern int execvpe(const char *file, char *const argv[], char *const envp[]);
这将满足编译器的要求,但是如果你得到一个链接器错误,那么在任何情况下该函数都不会包含在库中。