Ubuntu安装libbsd后链接器找不到strnstr()的原因排查
问题原因与解决方法
核心原因:链接器的库顺序要求
gcc调用的GNU链接器ld遵循严格的库文件后置规则:链接器处理库文件时,只会将当前已发现的未定义符号对应的库代码纳入链接流程。如果把-lbsd放在源文件test-strnstr.c前面,链接器处理libbsd时还未识别到需要strnstr的代码,就不会提取该符号;后续处理源文件时发现未定义的strnstr,已无对应库可匹配,因此报undefined reference错误。
而clang的链接器(或其默认配置)对库顺序的容忍度更高,即使库参数放在源文件前也能正确解析符号,所以可以正常运行。
解决方法
调整编译命令的顺序,将源文件放在库参数之前:
cc test-strnstr.c -lbsd
额外说明
- MacOS环境差异:MacOS的系统C标准库
libc本身内置了strnstr函数,因此无需引入bsd/string.h头文件,也不用链接额外库即可编译运行。 - Ubuntu环境的依赖:Ubuntu 22.04的系统
libc不包含strnstr,必须通过libbsd-dev包提供的bsd/string.h声明和libbsd库来获取该函数。
内容的提问来源于stack exchange,提问作者Monolo
相关产品推荐
相关产品推荐

