You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

  1. 先安装libbsd开发包,执行命令:sudo apt install libbsd-dev
  2. 对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 10:54:32