2013-08-31 21 views
6

Có người nói với tôi để sử dụng strlcpy chức năng thay vì strcpy như thế nàykhi tôi sử dụng chức năng strlcpy trong c các compilor cho tôi một lỗi

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

} 

và khi tôi biên dịch tập tin nó mang lại cho tôi những lỗi sau:

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 

thông báo: tôi đã cài đặt MinGW (Minimalist GNU dành cho Windows) và gcc phiên bản là 4.7.2

Sự cố là gì?

+0

@MitchWheat Một điểm hợp lệ, nhưng đó không phải là lý do tại sao 'ld' đang phàn nàn :-)) – cnicutar

+1

Tôi không nói đó là. :) –

+1

var1 chỉ có 6 không gian char và bạn đang cố gắng sao chép 6 từ char vào nó. Aint 'bạn mất tích tốt cũ của chúng tôi' \ 0 'hoặc aint' bạn sẽ viết bộ đệm trong quá khứ của var1? – Abhineet

Trả lời

4

undefined reference to `strlcpy'

này xảy ra khi các mối liên kết (collect2 nếu bạn đang sử dụng gcc) không thể tìm định nghĩa của hàm nó than phiền về (không các khai hoặc nguyên mẫu, nhưng nét, nơi mã của hàm được định nghĩa).

Trong trường hợp của bạn, điều này có thể xảy ra do không có đối tượng hoặc thư viện được chia sẻ với mã số strlcpy để liên kết. Nếu bạn chắc chắn có một thư viện với mã và bạn muốn liên kết với nó, hãy xem xét chỉ định đường dẫn đến thư viện với tham số -L<path_to_library> được chuyển tới trình biên dịch.

4

strlcpy() không phải là hàm C chuẩn.

Bạn có thể muốn sử dụng strncpy() hoặc propably cũng memcpy() thay thế.

+0

cảm ơn câu trả lời của bạn nhưng khi tôi biên dịch cùng một tệp trong (cygwin, gcc 4.7.3) nó hoạt động – Ameen

+0

@ameen: Các thư viện được sử dụng bởi những trình biên dịch này có thể cung cấp chức năng như một phần mở rộng cho tiêu chuẩn C. – alk

3

Thêm mã này vào mã của bạn:

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

sau đó, bạn có thể sử dụng nó. tận hưởng nó.

0

Tôi cũng gặp lỗi này khi cố gắng biên dịch mã và thấy rằng với Ubuntu 1604 lỗi sẽ biến mất nếu tôi liên kết với -lbsd.

Các vấn đề liên quan