最近,我尝试创建了一个库,为此我创建了两个文件:file-parser.c
和array.c
及其对应的.h
文件。所以,在文件解析器中,我使用调用长度的数组中的函数,当我编译(不链接)parser-file.c
命令时
gcc -c -o file-parser.o file-parser.c
gcc -c -o array.o array.c
ar r libutils.a array.o file-parser.o
不要告诉我一个错误。
问题是当我编译main.c
文件
gcc -o prova main.c -L. -lutils
gcc返回:
array/libutils.a(file-parser.o): in function "AnalizeRow":
file-parser.c:(.text+0x109): undefined reference to "length"
array/libutils.a(file-parser.o): in the function "GetWord":
file-parser.c:(.text+0x16a): undefined reference to "length"
collect2: error: ld returned 1 exit status
我不是英文,所以我认为错误信息是由 ld 带给我的。 任何人都可以解释我的错误在哪里? 感谢。
答案 0 :(得分:0)
在开发过程中的任何地方都可能发生类似的错误!!!
您的问题并未提供有关当前开发过程的完整信息。
我看到,在阅读完您的问题后,您有两个包含源代码的文件 - array.c 和 的文件parser.c 即可。另外,您提到了静态库 libutils.a ,但您没有说明 - 您现在是如何创建它以及包含它的内容。
我尝试重新创建您当前的位置:
文件 file-parser.c
#include <stdlib.h>
int
AnalizeRow(char row[])
{
size_t len = length(row);
return 0;
}
char *
GetWord(char row[])
{
size_t len = length(row);
return NULL;
}
文件 file-parser.h
int AnalizeRow(char row[]);
char* GetWord(char row[]);
文件 array.c
#include <string.h>
size_t
length(char row[])
{
return strlen(row);
}
文件 array.h
size_t length(char row[]);
创建空静态库 libutils.a
$ ar cr libutils.a
$ ar t libutils.a (it empty)
您的代码
$ gcc -c -o file-parser.o file-parser.c
$ gcc -c -o array.o array.c
$ ar r libutils.a array.o file-parser.o
内容 libutils.a
$ ar t libutils.a
array.o
file-parser.o
构建并运行
$ gcc -o prova main.c -L. -lutils && ./prova
我没有任何错误。。
初步结论:
$ gcc --version
gcc (Debian 4.9.2-10) 4.9.2
$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 8.7 (jessie)
Release: 8.7
Codename: jessie
$ uname -a
$ apt-cache policy binutils
binutils:
Installed: 2.25-5+deb8u1
Candidate: 2.25-5+deb8u1
Version table:
*** 2.25-5+deb8u1 0
500 http://ftp.ru.debian.org/debian/ jessie-proposed-updates/main amd64 Packages
100 /var/lib/dpkg/status
2.25-5 0
500 http://ftp.ru.debian.org/debian/ jessie/main amd64 Packages
500 http://httpredir.debian.org/debian/ jessie/main amd64 Packages