【问题标题】:when I use strlcpy function in c the compilor give me an error当我在 c 中使用 strlcpy 函数时,编译器给我一个错误
【发布时间】:2013-09-04 00:43:08
【问题描述】:

有人告诉我像这样使用strlcpy 函数而不是strcpy

#include <stdio.h>
#include <string.h>

void main()
{
   char var1[6] = "stuff";
   char var2[7] = "world!";
   strlcpy(var1, var2, sizeof(var2));
   printf("hello %s", var1);

} 

当我编译文件时 它给了我以下错误:

C:\Users\PC-1\AppData\Local\Temp\ccafgEAb.o:c.c:(.text+0x45): undefined referenc
e to `strlcpy'
collect2.exe: error: ld returned 1 exit status

注意:我已经安装了 MinGW(Minimalist GNU for Windows),gcc 版本是 4.7.2

有什么问题?

【问题讨论】:

  • 我没说是。 :)
  • var1 只有 6 个字符空间,您正在尝试将 6 个字符复制到它。是不是'你错过了我们的好旧'\0'或者你不打算写过去的var1缓冲区?
  • @NlightNFotis 很抱歉,但我不知道每个编译器都有自己的库
  • @ameen 你不用担心,你不应该什么都知道,这很好。您使用的函数通常是目标系统提供的 C 库的一部分。类 Unix 系统通常带有 glibc 或变体。您正在使用 Windows,因此您正在使用的编译器(gcc 的改编版本)包含了 c library 所需的内容,以防目标系统未提供它,因此为你写的程序。
  • 看看 4 年半前的自己……我在哪里……我学到了多少……给我一种美好的感觉!

标签: c string gcc linker


【解决方案1】:

对`strlcpy'的未定义引用

当链接器(collect2,如果您使用 gcc)找不到它所抱怨的函数的定义时会发生这种情况(不是 声明或原型,但定义,函数的代码是在其中定义的)。

在您的情况下,这可能是因为没有共享对象或库与 strlcpy 的代码链接。如果您确定有一个包含代码的库并且想要链接它,请考虑使用传递给编译器的 -L&lt;path_to_library&gt; 参数指定库的路径。

【讨论】:

    【解决方案2】:

    将此代码添加到您的代码中:

    #ifndef HAVE_STRLCAT
    /*
     * '_cups_strlcat()' - Safely concatenate two strings.
     */
    
    size_t                  /* O - Length of string */
    strlcat(char       *dst,        /* O - Destination string */
                  const char *src,      /* I - Source string */
              size_t     size)      /* I - Size of destination string buffer */
    {
      size_t    srclen;         /* Length of source string */
      size_t    dstlen;         /* Length of destination string */
    
    
     /*
      * Figure out how much room is left...
      */
    
      dstlen = strlen(dst);
      size   -= dstlen + 1;
    
      if (!size)
        return (dstlen);        /* No room, return immediately... */
    
     /*
      * Figure out how much room is needed...
      */
    
      srclen = strlen(src);
    
     /*
      * Copy the appropriate amount...
      */
    
      if (srclen > size)
        srclen = size;
    
      memcpy(dst + dstlen, src, srclen);
      dst[dstlen + srclen] = '\0';
    
      return (dstlen + srclen);
    }
    #endif /* !HAVE_STRLCAT */
    
    #ifndef HAVE_STRLCPY
    /*
     * '_cups_strlcpy()' - Safely copy two strings.
     */
    
    size_t                  /* O - Length of string */
    strlcpy(char       *dst,        /* O - Destination string */
                  const char *src,      /* I - Source string */
              size_t      size)     /* I - Size of destination string buffer */
    {
      size_t    srclen;         /* Length of source string */
    
    
     /*
      * Figure out how much room is needed...
      */
    
      size --;
    
      srclen = strlen(src);
    
     /*
      * Copy the appropriate amount...
      */
    
      if (srclen > size)
        srclen = size;
    
      memcpy(dst, src, srclen);
      dst[srclen] = '\0';
    
      return (srclen);
    }
    #endif /* !HAVE_STRLCPY */
    

    然后,您可以使用它。尽情享受吧。

    【讨论】:

      【解决方案3】:

      strlcpy() 不是标准 C 函数。

      您可能更喜欢使用strncpy()memcpy()

      【讨论】:

      • 感谢您的回答,但是当我在(cygwin,gcc 4.7.3)中编译相同的文件时,它可以工作
      • @ameen:这些编译器使用的库可能会提供该函数作为 C 标准的扩展。
      • 记住 strlcpy 修复了你的 0 终止字符,strncpy 不会这样做。
      【解决方案4】:

      我在尝试编译代码时也遇到了这个错误,发现在 Ubuntu 1604 中,如果我链接 -lbsd,这个错误就会消失。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-29
        • 2022-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多