链接静态C库时未定义的引用

时间:2015-02-23 20:55:26

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

问题是链接器(gcc)与大多数链接器一样,从左到右处理参数。所以链接看到库,但没有未处理的引用被处理,所以没有任何反应。

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