c - 链接静态 C 库时 undefined reference

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

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

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

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

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

最佳答案

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

解决方法是将库放在行的最后,而不是紧跟在 CFLAGS 之后。

关于c - 链接静态 C 库时 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28683254/

相关文章:

c - 存储三元值的最紧凑方式是什么?

c - 二叉搜索树的非递归迭代器

c - gstreamer 插件库未链接到 opencv 共享对象库 - Ubuntu 上的 "undefined symbol"

android - 不能在两个不同的类中使用外部 JNI 函数,不满足链接错误

c - 库之间的区别以及如何包含它们

c - scanf(参数) == 1 vs 1 == scanf(参数) 没有区别吗?

c - 经过一些计数后执行下一个 else 语句

c++ - 链接 netpbm 库时出现问题

c++ - 如何在我的项目中使用 FFTW DLL 导入库 .lib 作为静态 .lib?

objective-c - 如何分发静态库?