【问题标题】:Link Main error with library将主要错误与库链接
【发布时间】:2017-03-12 22:49:55
【问题描述】:

最近,我尝试创建一个库并为此创建了两个文件: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 带给我的。 谁能解释我的错误在哪里? 谢谢。

【问题讨论】:

    标签: c static-libraries ld static-linking


    【解决方案1】:

    类似的错误可能发生在开发过程中的任何地方!!!

    您的问题并未全面介绍当前的开发过程。

    我明白了,在阅读了您的问题后,您有两个带有源代码的文件 - array.c文件解析器.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. 文件中的源代码是导致问题的原因

    测试环境

    $ 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-07
      • 2011-02-25
      • 1970-01-01
      • 2017-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多