I am trying to create my own implementation of strlcpy
but first, I wanted to test the original function.
When I try to compile my code with gcc -Wall -Wextra -Werror ft_strlcpy.c
, I get this:
/usr/bin/ld: /tmp/ccaTaHki.o: in function `test':
ft_strlcpy.c:(.text 0x59): undefined reference to `strlcpy'
collect2: error: ld returned 1 exit status
This is my code sample for testing the function:
#include <stdio.h>
#include <bsd/string.h>
void test(int size)
{
char string[] = "Hello there, Venus";
char buffer[19];
int r;
r = strlcpy(buffer, string, size);
printf("Copied '%s' into '%s', length %d\n", string, buffer, r);
}
int main()
{
test(19);
test(10);
test(1);
test(0);
return (0);
}
What am I doing wrong how can I test it?
CodePudding user response:
When I try to compile my code with gcc -Wall -Wextra -Werror ft_strlcpy.c, I get this:
/usr/bin/ld: /tmp/ccaTaHki.o: in function `test': ft_strlcpy.c:(.text 0x59): undefined reference to `strlcpy' collect2: error: ld returned 1 exit status
That is a linker error, indicating that the function you are trying to call is not found in your code or in any of the libraries being linked, including the C standard library.
Having recognized that, the (Linux) manual page for strlcpy()
quickly yields a probable reason and solution where it says, near the top:
Library
Utility functions from BSD systems (libbsd, -lbsd)
Supposing that that documentation is relevant to you, which it probably is if you are compiling with gcc
, it tells you not only what library but exactly what link option to use: -lbsd
. Therefore, compile your code this way:
gcc -Wall -Wextra -Werror ft_strlcpy.c -lbsd
That works for me.
CodePudding user response:
Your quick test is somewhat unreliable because buffer
is uninitialized so the output is unpredictable for the last test.
Here is a modified version with more explicit output:
#include <stdio.h>
#include <string.h>
void test(int size) {
char string[] = "Hello there, Venus";
char buffer[20] = "xxxxxxxxxxxxxxxxxxx";
int r = strlcpy(buffer, string, size);
int len = strlen(buffer);
printf("Source: '%s', size: %d, buffer: '%s', len: %d, result: %d\n",
string, size, buffer, len, r);
}
int main() {
test(19);
test(10);
test(1);
test(0);
return 0;
}
Output:
Source: 'Hello there, Venus', size: 19, buffer: 'Hello there, Venus', len: 18, result: 18
Source: 'Hello there, Venus', size: 10, buffer: 'Hello the', len: 9, result: 18
Source: 'Hello there, Venus', size: 1, buffer: '', len: 0, result: 18
Source: 'Hello there, Venus', size: 0, buffer: 'xxxxxxxxxxxxxxxxxxx', len: 19, result: 18