【问题标题】:Compiler warnings for execvpe functionexecvpe 函数的编译器警告
【发布时间】:2024-01-11 18:27:02
【问题描述】:

我有一个用 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) 手册页明确指出应该“使用 -pthread 编译和链接”,而 exec(3) 系列函数的手册页没有任何此类说明。此外,我在手册或网上找不到任何关于 exec(3) 系列的类似编译器标志的参考。

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

【问题讨论】:

    标签: c gcc exec compiler-warnings


    【解决方案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[]);
    

    这将满足编译器的要求,但如果你得到一个链接器错误,那么该函数在任何情况下都不会包含在库中。

    【讨论】:

    • 我知道这是标记为 gcc 但在 MSVC 中该函数位于 &lt;process.h&gt;
    • @WeatherVane :我认为这是使用 unistd.h 的 glibc。 OP可能会添加一个标签来澄清。