链接静态C库时未定义的引用
在我的最新项目中,我遇到了一个有关未共享库方法的未定义引用的奇怪问题。我搜索了但所有我能找到的是C++相关(extern“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
问题是链接器(gcc)像大多数链接器一样,从左到右处理参数。所以链接看到库,但没有未解决的引用要处理,所以没有任何反应。
解决的办法是将库放在最后一行,而不是仅在CFLAGS之后。
谢谢,当我读到LDFLAGS的时候发现,但是答案太慢。出于某种原因,我通过旗帜顺序是无关紧要的。 – MrFloya 2015-02-25 13:57:35
@RSahu我不这么认为。库本身编译得很好,并包含有问题的函数。它似乎没有正确链接。 – MrFloya 2015-02-24 08:42:42
你说得对。他们是无关的。 – 2015-02-24 15:37:17