Link 库的主要错误
Link Main error with library
最近,我尝试创建一个库,为此我创建了两个文件: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 returns:
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 带给我的。
谁能解释我的错误在哪里?
谢谢。
开发过程中任何地方都可能出现类似的错误!!!
您的问题没有完整描述当前的开发过程。
我明白了,在阅读你的问题后,你有两个带有源代码的文件 - array.c 和
文件-parser.c。另外,您提到了静态库 libutils.a,但您没有说明 - 您是如何创建它的以及目前包含它的内容。
我尝试重新创建您当前的位置:
文件文件-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;
}
文件文件-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
我完全没有错误。。
初步结论:
- 我的开发流程有误
- 您的静态库 libutils.a 是导致问题的原因
- 文件中的源代码导致了问题
测试环境
$ 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
最近,我尝试创建一个库,为此我创建了两个文件: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 returns:
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 带给我的。 谁能解释我的错误在哪里? 谢谢。
开发过程中任何地方都可能出现类似的错误!!!
您的问题没有完整描述当前的开发过程。
我明白了,在阅读你的问题后,你有两个带有源代码的文件 - array.c 和 文件-parser.c。另外,您提到了静态库 libutils.a,但您没有说明 - 您是如何创建它的以及目前包含它的内容。
我尝试重新创建您当前的位置:
文件文件-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;
}
文件文件-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
我完全没有错误。。
初步结论:
- 我的开发流程有误
- 您的静态库 libutils.a 是导致问题的原因
- 文件中的源代码导致了问题
测试环境
$ 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