【问题标题】:Inter-dependencies between static libraries静态库之间的相互依赖
【发布时间】:2015-05-28 21:06:52
【问题描述】:

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

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

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

  1. 我将在 Cortex-M3 MCU 上的 FreeRTOS 上运行此代码,因此静态链接是我唯一的选择。
  2. 我真的希望能够在不更改 libB 的编译过程的情况下做到这一点。

link 也有类似的问题,但正如我所说,动态链接不是一种选择。

应 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;
}

ma​​in.c

#include <libA.h>
#include <libB.h>

int main()
{
    printf("%d", libA_fun2() * libB_fun1()); 
    return 0;
}

我构建 libA.a 和 libB.a。终于

gcc main.c -lA -lB -LPathA -LPathB

给出错误:未定义对 libB_filexx.c 中的 libA_fun1 的引用,第 xx 行

但是,该函数在 libA.h 中正确定义

【问题讨论】:

  • 完全支持此方案。你能发布确切的错误信息吗?更好 - 一个演示链接错误的玩具代码?
  • @OfekShilon - 我已经更新了一个例子
  • 你在做什么,一般来说,应该很好(假设没有循环依赖),所以我会寻找其他方式构建设置。这是一个愚蠢的猜测,但由于链接器顺序,我很久以前就被咬过。尝试颠倒链接mainAB 的顺序。例如:gcc main.c -lB -lA -LPathB -LPathA
  • 你猜怎么着!那行得通!怎么样?!!

标签: eclipse gcc linker dependencies static-libraries


【解决方案1】:

感谢 @Ike 提出的有效修复建议。

简而言之:

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

库出现在链接器中的顺序也很重要,这就是我的链接命令失败的地方。

【讨论】:

    猜你喜欢
    • 2019-07-05
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    相关资源
    最近更新 更多