ubuntu 如何在C语言的makefile中链接strlcpy-未定义对'strlcpy'的引用

q43xntqr  于 2022-11-22  发布在  其他
关注(0)|答案(3)|浏览(549)

我对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编译它
先谢了

u5rb5r59

u5rb5r591#

使用BSD函数strlcpystrlcat的代码应该与libbsd链接。如果您的系统中没有这个库,您可以在自己的程序中添加这些函数的源代码:

#include <string.h>

size_t strlcpy(char *dst, const char *src, size_t n) {
    char *p = dst;

    if (n != 0) {
        for (; --n != 0; p++, src++) {
            if ((*p = *src) == '\0')
                return p - dst;
        }
        *p = '\0';
    }
    return (p - dst) + strlen(src);
}

size_t strlcat(char *dst, const char *src, size_t n) {
    char *p = dst;

    while (n != 0 && *p != '\0') {
        p++;
        n--;
    }
    if (n != 0) {
        for (; --n != 0; p++, src++) {
            if ((*p = *src) == '\0')
                return p - dst;
        }
        *p = '\0';
    }
    return (p - dst) + strlen(src);
}
tsm1rwdh

tsm1rwdh2#

strlcpyGLib Package 函数为g_strlcpy,描述如下:

gsize g_strlcpy (gchar* dest, const gchar* src, gsize dest_size);

可移植性 Package 器,在具有strlcpy()的系统上调用它,否则模拟strlcpy()。
要直接使用strlcpylibbsd版本,程序应在覆盖模式1下与-lbsd链接,并包含<string.h>头。
1叠加模式的详细信息,来自libbsd(7)
该库可以在覆盖模式下使用,这是首选的方式,因此代码是可移植的,不需要修改原始BSD代码。
这可以通过pkg-config(3)库libbsd-overlay来实现,或者通过在系统包含路径列表中添加带有bsd/后缀的特定于系统的包含目录来实现,对于gcc,这可以是-isystem ${includedir}/bsd。
此外,还需要定义LIBBSD_OVERLAY预处理器变量。

qnakjoqk

qnakjoqk3#

安装libbsd和pkg-config(3)后,使用此**pkg-config --cflags --libs libbsd-overlay**编译以使用libbsd-overlay。您的库头文件应该保持相同,就像您在使用BSD作为默认值的系统上一样。overlay在可移植性方面很酷。
pkg-config-guide

相关问题