C语言Makefile编译时strlcpy未定义引用报错如何解决
报错根因
strlcpy 不属于glib-2.0提供的接口,即使引入<glib.h>也不会获得该函数的实现:
- Ubuntu 20.04自带的glibc默认不提供BSD系的
strlcpy函数 - glib-2.0对应的同功能安全拷贝接口为
g_strlcpy,参数、返回值逻辑和strlcpy完全一致 - 你当前链接的
-lcrypto、-ljson-c、-lglib-2.0所有库中都没有strlcpy的符号,因此触发undefined reference链接错误。
解决方案
二选一即可:
方案1:保留代码中strlcpy写法,仅修改Makefile
- 先安装libbsd开发包,执行命令:
sudo apt install libbsd-dev - 对Makefile做3处调整:
- 在头文件搜索路径
IDIR中新增-I/usr/include/bsd - 在链接参数
LFLAGS末尾新增-lbsd - 移除编译
.o目标时传入的$(LFLAGS)参数:编译阶段加-c参数仅做语法检查不执行链接,传入链接参数无意义。
- 在头文件搜索路径
修改后可正常编译的Makefile参考:
OUT=reg_maker OBJS=reg_maker.o CC=gcc IDIR = -I../../../include -I../../../include/xxxx -I/usr/include/json-c/ -I/usr/lib/x86_64-linux-gnu/glib-2.0/include/ -I/usr/include/glib-2.0 -I/usr/include -I/usr/include/bsd FLAGS= -c -g -Wall LFLAGS= -lcrypto -ljson-c -lglib-2.0 -lbsd all: $(OUT) $(OUT): $(OBJS) $(CC) -g $(OBJS) -o $(OUT) $(LFLAGS) reg_maker.o: reg_maker.c $(CC) $(FLAGS) reg_maker.c $(IDIR) clean: rm -f $(OBJS) $(OUT) reg_maker.bin
方案2:不新增依赖库,直接修改C代码
因为你已经引入了<glib.h>并链接了glib-2.0,直接把代码中所有strlcpy调用替换为g_strlcpy即可,无需调整现有Makefile的链接参数,函数功能、传参、返回值完全兼容。
内容的提问来源于stack exchange,提问作者Ellariz
相关产品推荐
相关产品推荐

