链接库

时间:2016-10-30 18:34:50

标签: c static-libraries ld static-linking

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

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 带给我的。 任何人都可以解释我的错误在哪里? 感谢。

1 个答案:

答案 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

我没有任何错误。

初步结论:

  1. 我的开发过程错误
  2. 您的静态库 libutils.a 导致问题
  3. 文件中的源代码导致问题
  4. 测试环境

    $ 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