2015-02-23 118 views
1

在我的最新项目中,我遇到了一个有关未共享库方法的未定义引用的奇怪问题。我搜索了但所有我能找到的是C++相关(extern“C”)或者没有真正帮助。链接静态C库时未定义的引用

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

我检查了结果libosm.anm和该方法是在那里,并出口,但由于某种原因,它没有找到链接。以下是我目前的标志。我尝试改变顺序,甚至包括所有库两次(如另一个线程中所建议的),但我总是以未定义的参考结束。

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 
+0

@RSahu我不这么认为。库本身编译得很好,并包含有问题的函数。它似乎没有正确链接。 – MrFloya 2015-02-24 08:42:42

+0

你说得对。他们是无关的。 – 2015-02-24 15:37:17

回答

2

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

解决的办法是将库放在最后一行,而不是仅在CFLAGS之后。

+0

谢谢,当我读到LDFLAGS的时候发现,但是答案太慢。出于某种原因,我通过旗帜顺序是无关紧要的。 – MrFloya 2015-02-25 13:57:35

相关问题