GNU dd代码中printf(_("abc"))的_是什么?编译为何报错?
GNU dd源码中
_符号的作用及编译错误解析 _的核心作用
_是GNU gettext国际化工具链中的字符串翻译标记宏。它的功能是标记需要做多语言适配的字符串,在程序运行时,会根据当前系统的语言环境,把原始字符串(比如"abc")替换为对应语言的翻译文本,以此实现程序的多语言支持。
编译错误的原因
出现undefined reference to _'`错误和类型警告,本质是编译/链接过程中缺少gettext相关配置:
- 直接用gcc单文件编译时,没有引入gettext的头文件(
#include <libintl.h>)或定义必要宏(如_GNU_SOURCE),编译器无法识别_的宏定义,将其误判为未定义的函数; - 链接阶段未指定
-lintl参数,链接器找不到_函数的具体实现; - GNU coreutils源码依赖autotools构建系统自动处理国际化配置,手动单文件编译会遗漏这些自动注入的编译/链接参数。
编译问题的解决方式
如果要单独编译dd.c,需手动补充gettext相关参数:
- 编译命令示例:
gcc -DLOCALEDIR="/usr/share/locale" -I/usr/include dd.c -o dd - 链接时需追加
-lintl参数:gcc ... -lintl -L/usr/lib(路径根据系统实际情况调整) - 更稳妥的方式是使用coreutils自带的构建流程:执行
./configure && make,构建系统会自动处理所有国际化相关配置。
内容的提问来源于stack exchange,提问作者gitman-2021
相关产品推荐
相关产品推荐

