Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Eclipse 静态库之间的相互依赖关系_Eclipse_Gcc_Linker_Dependencies_Static Libraries - Fatal编程技术网

Eclipse 静态库之间的相互依赖关系

Eclipse 静态库之间的相互依赖关系,eclipse,gcc,linker,dependencies,static-libraries,Eclipse,Gcc,Linker,Dependencies,Static Libraries,我正在尝试链接两个库libA.a和libB.a以及一个主.c文件。libB依赖于libA,main依赖于两者 我能够独立地编译这些库,但是当我试图将它们链接在一起以创建最终的可执行文件时,我得到了一个错误,即没有定义B对A的函数的引用 有没有办法告诉链接器在libA中搜索这些函数 我将在Cortex-M3 MCU上的FreeRTOS上运行此代码,因此静态链接是我唯一的选择 我真的希望能够做到这一点而不改变libB的编译过程 在这方面也有类似的问题,但正如我所说,动态链接不是一个选项 按照Ofek

我正在尝试链接两个库libA.a和libB.a以及一个主.c文件。libB依赖于libA,main依赖于两者

我能够独立地编译这些库,但是当我试图将它们链接在一起以创建最终的可执行文件时,我得到了一个错误,即没有定义B对A的函数的引用

有没有办法告诉链接器在libA中搜索这些函数

  • 我将在Cortex-M3 MCU上的FreeRTOS上运行此代码,因此静态链接是我唯一的选择
  • 我真的希望能够做到这一点而不改变libB的编译过程
  • 在这方面也有类似的问题,但正如我所说,动态链接不是一个选项

    按照Ofek的要求玩具代码 (忽略功能和语法错误(如果有)——

    libA

    int libA_fun1()
    { return stuff; }
    
    int libA_fun2()
    { return something_else; }
    
    libB

    #include <libA.h>
    
    int libB_fun1()
    {
        //do stuff
        int x = libA_fun1();
        return something;
    }
    
    给出错误:未定义对libB_filexx.c中libA_fun1的引用,第xx行


    但是,由于@Ike建议了一个有效的修复方法,libA.h中正确定义了该函数

    简言之: 如果任何[静态]库B依赖于库A中定义的符号,则库B应首先出现在提供给链接器的列表中。 可以找到更详细的解释


    libries在链接器中出现的顺序也很重要,这也是我的链接命令失败的原因。

    完全支持此方案。你能发布准确的错误消息吗?更好的是——一个演示链接错误的玩具代码?@OfekShilon——我已经用一个示例更新了您正在做的事情,一般来说,应该是非常好的(前提是没有循环依赖关系),所以我希望构建其他设置。这是一个愚蠢的猜测,但由于链接器的顺序,我在很久以前就被咬过。尝试颠倒链接
    main
    A
    B
    的顺序。示例:
    gcc main.c-lB-lA-LPathB-LPathA
    Hey猜猜看!成功了!!怎样?!!
    #include <libA.h>
    #include <libB.h>
    
    int main()
    {
        printf("%d", libA_fun2() * libB_fun1()); 
        return 0;
    }
    
    gcc main.c -lA -lB -LPathA -LPathB