Link 库的主要错误

Link Main error with library

最近,我尝试创建一个库,为此我创建了两个文件:file-parser.carray.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

我完全没有错误。


初步结论:

  1. 我的开发流程有误
  2. 您的静态库 libutils.a 是导致问题的原因
  3. 文件中的源代码导致了问题

测试环境

$ 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