【问题标题】:How to link strlcpy in makefile in c- undefined reference to `strlcpy'如何在 c-未定义的对“strlcpy”的引用中将 strlcpy 链接到 makefile
【发布时间】:2022-11-05 05:44:00
【问题描述】:

我是 C 编程和 Makefile 的新手。

我的 c 代码中有一个函数,它使用 strlcpy 来复制字符串。

我不允许在我的代码中使用 #include <bsd/string.h> 所以我已经包含了 #include <glib.h> 。 但是在编译makefile时,

收到错误: /usr/bin/ld: reg_maker.o: 在函数main': /home/reg_maker.c:66: undefined reference to strlcpy' /usr/bin/ld: /home/reg_maker.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 version- 20.04 ,我有 glib-2.0 库。

谁能帮我看看我必须在make文件中做些什么改变才能用strlcpy编译它

提前致谢

【问题讨论】:

  • Makefile 掩盖了这个问题。首先弄清楚如何在没有 Makefile 的情况下进行构建。
  • 约定很重要。 LFLAGS 是 lex 的标志。 LDFLAGS 是链接器的标志。

标签: c ubuntu makefile glibc


【解决方案1】:

使用 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) == '
【解决方案2】:

strlcpyGLib 包装器是 g_strlcpy,描述为:

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

可移植性包装器,它在拥有它的系统上调用 strlcpy(),否则模拟 strlcpy()。


要直接使用libbsd版本的strlcpy,程序需要以覆盖模式链接-lbsd1并包含&lt;string.h&gt; 标头。

1叠加模式详情,来自libbsd(7)

该库可以在覆盖模式下使用,这是首选方式,因此代码是可移植的,不需要对原始 BSD 代码进行修改。

这可以通过名为 libbsd-overlay 的 pkg-config(3) 库轻松完成。或者通过将带有 bsd/ 后缀的系统特定包含目录添加到系统包含路径列表中。对于 gcc,这可能是 -isystem ${includedir}/bsd。

此外,还需要定义 LIBBSD_OVERLAY 预处理器变量。

【讨论】:

  • 您好,感谢您的答复。但我不允许链接使用 libbsd 或 bsd 库标志 -lbsd。而是被要求使用 glib-2.0 库
  • @Ellariz我已经修改了答案。
【解决方案3】:

安装 libbsd 和 pkg-config(3) 后,用这个编译pkg-config --cflags --libs libbsd-overlay为了使用 libbsd-overlay。您的库头文件应该与您在默认使用 BSD 的系统上保持相同。覆盖在便携性方面很酷。

pkg-config-guide

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    • 2021-12-19
    • 2020-12-03
    相关资源
    最近更新 更多