【问题标题】:Static library symbols not being found even with -l即使使用 -l 也找不到静态库符号
【发布时间】:2011-02-15 22:41:53
【问题描述】:

我有一个静态库 liborc-0.4.a,没有共享库。我有另一个库 libschroedinger-1.0.a(无共享),它依赖于 liborc-0.4.a 中的符号。如果我在 liborc-0.4.a 上运行 nm,则诸如 orc_init 之类的符号将显示为 T(意味着它们已定义)。我使用命令行标志 -lorc-0.4 构建了 libschroedinger-1.0.a,所以它看到了符号并且没问题。

但是,现在我有一个依赖于 libschroedinger-1.0.a 的小型可执行文件。它编译得很好,但是当我运行链接器时

gcc -lschroedinger-1.0 -lorc-0.4 -o output input.o

它给出的错误如下:

/usr/local/lib/libschroedinger-1.0.a(libschroedinger_1.0_la-schro.o):schro.c:(.text+0x21):
undefined reference to `orc_init'

【问题讨论】:

    标签: c linker-errors


    【解决方案1】:

    gcc 对库的顺序很敏感。在编译liborc-0.4.a时,不需要orc_init,所以不包括在内。解决方法是将LDFLAGS放在命令末尾:

    gcc -o output input.o -lschroedinger-1.0 -lorc-0.4
    

    【讨论】:

    • 唯一的要求是所有库的依赖项在编译器行中之后列出。因此,如果 liba 依赖于 libb,则编写 gcc ... -la -lb。如果存在循环依赖,则包含两次相同的库。
    • @johs34yp:GNU binutils ld 实际上支持--start-group--end-group(或-(-)),它会重复扫描其中列出的库/档案中的符号以解决循环依赖关系.但是,它不是可移植的,也不推荐:首先应该避免创建循环依赖的库。
    【解决方案2】:

    您很可能使用共享 liborc 编译了 libschroedinger。静态库与存档中的一堆目标文件相同,因此它们只需要查看标题即可。像下面这样写以确保(同样适用于 liborc)。

    gcc /path/to/libschroedinger-1.0.a /path/to/liborc-0.4.a -o output input.o
    

    【讨论】:

      猜你喜欢
      • 2021-08-17
      • 1970-01-01
      • 1970-01-01
      • 2013-08-05
      • 1970-01-01
      • 1970-01-01
      • 2015-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多