【问题标题】:Undefined reference while linking static C library链接静态 C 库时未定义的引用
【发布时间】:2015-02-23 20:55:25
【问题描述】:

在我的最新项目中,我遇到了一个关于未定义对共享库方法的引用的奇怪问题。我在 SO 上进行了搜索,但我只能找到与 C++ 相关的(外部“C”)或没有真正帮助的。

有问题的库是 my fork of libosm,它使用 protobuf 为其二进制格式 (.osm.pbf) 生成 OpenStreetMap 数据的反序列化代码。有问题的函数是osmpbf__blob__unpack,但这只是我最终使用的第一个函数,所以我怀疑它是一个普遍问题。

我用nm 检查了生成的libosm.a,该方法存在并导出,但由于某种原因在链接时找不到它。以下是我目前的标志。我尝试更改顺序,甚至两次包括所有库(如另一个线程中所建议的那样),但我总是以未定义的引用结束。

CFLAGS      = -v -std=c99 -O3 -Wall -Wextra -pedantic
LIBFLAGS    = -losmpbf -lprotobuf-c -lz -lpthread

目前我对错误可能是什么感到很迷茫,但我认为这可能是一个小的一般错误。好久没用C了。。 任何帮助将不胜感激。

干杯, 弗洛里安

编辑:这是我完整的 Makefile。我只是为变量 LIBFLAGS 起了名字,因为我使用了自己的小规则,但似乎我应该使用 LDLIBS 和这个简单案例的内置规则。

CC          = gcc
CFLAGS      = -v -std=c99 -O3 -Wall -Wextra -pedantic
LIBFLAGS    = -losmpbf -lprotobuf-c -lz -lpthread

all: main.x

main.x: main.c
    $(CC) $(CFLAGS) $(LIBFLAGS) main.c -o main.x

clean:
    rm -rf *.o main.x

【问题讨论】:

  • @RSahu 我不这么认为。该库本身编译良好并包含有问题的函数。它似乎没有正确链接。
  • 你是对的。它们是无关的。

标签: c linker static-libraries protocol-buffers static-linking


【解决方案1】:

问题在于链接器 (gcc) 与大多数链接器一样,从左到右处理参数。所以链接可以看到库,但是没有要处理的未解析引用,所以什么也没有发生。

解决方法是将库放在最后一行而不是放在 CFLAGS 之后。

【讨论】:

  • 谢谢,我在阅读 LDFLAGS 时发现了这一点,但回答太慢了。出于某种原因,我认为标志顺序无关紧要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-14
  • 1970-01-01
  • 2015-01-24
  • 1970-01-01
  • 1970-01-01
  • 2014-12-11
  • 1970-01-01
相关资源
最近更新 更多