c - 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.h
https://linux.die.net/man/3/getcwd中定义
为什么编译器没有找到get_current_dir_name
并且没有编译?
解决方案
您需要_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>
推荐阅读
- javascript - 字符串拆分避免“\n” JavaScript
- javascript - Leaflet openstreetmap 加载,但未出现
- php - 如何在 Symfony 4 上的输入文件上显示错误?
- ios - 通过 OneDrive API 或替代方法访问 DocumentLibrary
- android - 与在 kotlin/android 中接受邀请的所有用户共享单个用户单击的所有值
- javascript - Angular 即时搜索仅在按下回车键或按下搜索图标时显示命中
- linux - 直接从脚本运行命令到另一个进程
- postgresql - postgresql 中的 slonik 是什么
- jenkins - 如何在 Jenkins 管道中传递数字密码。?
- angular - ngClass 不使用绑定从 .scss 应用样式