2013-08-31 14 views
6

ktoś powiedział mi, aby korzystać z funkcji strlcpy zamiast strcpy jak tengdy używam funkcji strlcpy w C compilor dać mi błąd

#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); 

} 

i kiedy mogę skompilować plik daje mi następujący błąd:

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 

Wskazówka: mam zainstalowany MinGW (Minimalist GNU dla Windows) i gcc wersja to 4.7.2

Na czym polega problem?

+0

@MitchWheat Ważny punkt, ale nie dlatego, że 'ld' narzeka :-)) – cnicutar

+1

Nie powiedziałem, że tak. :) –

+1

Zmienna 1 ma tylko 6 znaków i próbujesz skopiować 6 znaków do niej. Aint "brakuje ci naszego starego dobrego" \ 0 "lub" aint "napiszesz wcześniejszy bufor var1? – Abhineet

Odpowiedz

4

undefined reference to `strlcpy'

Dzieje się tak, gdy łącznik (collect2 jeśli używasz gcc) nie może znaleźć definicję funkcji to narzeka (nie deklaracja lub prototyp, ale z definicji , gdzie kod funkcji jest zdefiniowany).

W twoim przypadku może się tak zdarzyć, ponieważ nie ma współdzielonego obiektu lub biblioteki z kodem strlcpy, z którym ma być link. Jeśli masz pewność, że istnieje biblioteka z kodem i chcesz się do niej linkować, rozważ określenie ścieżki do biblioteki za pomocą parametru przekazanego do kompilatora -L<path_to_library>.

4

strlcpy() nie jest standardową funkcją C.

Możesz użyć zamiast tego strncpy() lub prawdopodobnie również memcpy().

+0

dziękuję za odpowiedź, ale kiedy skompiluję ten sam plik (cygwin, gcc 4.7.3) działa – Ameen

+0

@ameen: Biblioteki używane przez te kompilatory mogą udostępniać tę funkcję jako rozszerzenie standardu C. – alk

3

Dodaj ten kod do kodu:

#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 */ 

wtedy można go używać. Ciesz się.

0

Również dostałem ten błąd podczas próby skompilowania kodu i stwierdziłem, że w systemie Ubuntu 1604 błąd zniknie, jeśli połączę się z -lbsd.

Powiązane problemy