我对C编程和Makefile是新手。
我在我的c代码中有一个函数,它使用strlcpy来复制字符串。
我不允许在我的代码中使用#include〈bsd/string.h〉,所以我包含了#include<glib.h>。但是在编译makefile时,
获取错误:/***用户名/bin/ld:注册表名:在函数main': /home/reg_maker.c:66: undefined reference to
strlcpy' /usr/bin/ld中:/home/注册表制造商.c:67:未定义对'strlcpy'***的引用
下面是我使用的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
FLAGS= -c -g -Wall
LFLAGS= -lcrypto -ljson-c -lglib-2.0
all: $(OBJS)
$(CC) -g $(OBJS) -o $(OUT) $(LFLAGS)
reg_maker.o:reg_maker.c
$(CC) $(FLAGS) reg_maker.c $(IDIR) $(LFLAGS)
clean:
rm -f $(OBJS) $(OUT) reg_maker.bin`
我用的是ubuntu vm版本-20.04,我有glib-2.0库。
有没有人能帮我在make文件中做些什么修改,以便用strlcpy编译它
先谢了
3条答案
按热度按时间u5rb5r591#
使用BSD函数
strlcpy
和strlcat
的代码应该与libbsd
链接。如果您的系统中没有这个库,您可以在自己的程序中添加这些函数的源代码:tsm1rwdh2#
strlcpy
的GLib Package 函数为g_strlcpy
,描述如下:可移植性 Package 器,在具有strlcpy()的系统上调用它,否则模拟strlcpy()。
要直接使用
strlcpy
的libbsd
版本,程序应在覆盖模式1下与-lbsd
链接,并包含<string.h>
头。1叠加模式的详细信息,来自
libbsd(7)
:该库可以在覆盖模式下使用,这是首选的方式,因此代码是可移植的,不需要修改原始BSD代码。
这可以通过pkg-config(3)库libbsd-overlay来实现,或者通过在系统包含路径列表中添加带有bsd/后缀的特定于系统的包含目录来实现,对于gcc,这可以是-isystem ${includedir}/bsd。
此外,还需要定义LIBBSD_OVERLAY预处理器变量。
qnakjoqk3#
安装libbsd和pkg-config(3)后,使用此**
pkg-config --cflags --libs libbsd-overlay
**编译以使用libbsd-overlay。您的库头文件应该保持相同,就像您在使用BSD作为默认值的系统上一样。overlay在可移植性方面很酷。pkg-config-guide