链接静态C库时未定义的引用
在我最近的项目中,我遇到了一个奇怪的问题,关于对共享库方法的未定义引用。我搜索了,但是我能找到的是C++相关的(ExcN)C,或者没有帮助。 该库使用protobuf为二进制格式的OpenStreetMap数据(.osm.pbf)生成反序列化/序列化代码。所讨论的函数是链接静态C库时未定义的引用,c,linker,static-libraries,protocol-buffers,static-linking,C,Linker,Static Libraries,Protocol Buffers,Static Linking,在我最近的项目中,我遇到了一个奇怪的问题,关于对共享库方法的未定义引用。我搜索了,但是我能找到的是C++相关的(ExcN)C,或者没有帮助。 该库使用protobuf为二进制格式的OpenStreetMap数据(.osm.pbf)生成反序列化/序列化代码。所讨论的函数是osmpbf\uuu blob\uu unpack,但这只是我最后使用的第一个函数,因此我怀疑这是一个普遍问题 我用nm检查了生成的libosm.a,该方法已存在并导出,但由于某种原因,在链接时未找到该方法。下面是我当前的标志。我
osmpbf\uuu blob\uu 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
问题是链接器(gcc)和大多数链接器一样,从左到右处理参数。所以链接可以看到库,但是没有未解析的引用需要处理,所以什么都不会发生
解决办法是将库放在最后一行,而不是放在CFLAGS之后。@RSahu我不这么认为。库本身编译得很好,并且包含有问题的函数。它似乎没有正确链接。你是对的。它们是不相关的。谢谢,当我读到关于LDFLAGS的文章时,我发现了这一点,但回答起来太慢了。出于某种原因,我认为国旗的顺序无关紧要。