首页 > 解决方案 > get_current_dir_name 简单程序无法编译 -> 库函数的隐式声明

问题描述

我有一个非常简单的程序,我用它来尝试更好地学习 C:

#include <stdio.h>
#include <stdlib.h>
#define _GNU_SOURCE
#include <string.h>
#include <unistd.h>

int main() {
    printf("%s\n", get_current_dir_name());
    return 0;
}

但问题是这样编译这个程序:

gcc -o pushtob2 pushtob2.c -Wall -pedantic -std=gnu11  -static -Wextra -Wconversion

产生错误:

pushtob2.c: In function ‘main’:
pushtob2.c:8:17: warning: implicit declaration of function ‘get_current_dir_name’ [-Wimplicit-function-declaration]
  printf("%s\n", get_current_dir_name());
                 ^~~~~~~~~~~~~~~~~~~~
pushtob2.c:8:11: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Wformat=]
  printf("%s\n", get_current_dir_name());
          ~^     ~~~~~~~~~~~~~~~~~~~~~~
          %d

有人告诉我get_current_dir_name应该在unistd.hhttps://linux.die.net/man/3/getcwd中定义

为什么编译器没有找到get_current_dir_name并且没有编译?

标签: cgcccompiler-errorsgnu

解决方案


您需要_GNU_SOURCE在包含任何标头之前定义(和一般的功能测试宏) - 即不仅仅是包含相关结构的标头 - 所以改变这个:

#include <stdio.h>
#include <stdlib.h>
#define _GNU_SOURCE
#include <string.h>
#include <unistd.h>

对此:

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

推荐阅读