Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
链接静态C库时未定义的引用_C_Linker_Static Libraries_Protocol Buffers_Static Linking - Fatal编程技术网

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

链接静态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,该方法已存在并导出,但由于某种原因,在链接时未找到该方法。下面是我当前的标志。我

在我最近的项目中,我遇到了一个奇怪的问题,关于对共享库方法的未定义引用。我搜索了,但是我能找到的是C++相关的(ExcN)C,或者没有帮助。 该库使用protobuf为二进制格式的OpenStreetMap数据(.osm.pbf)生成反序列化/序列化代码。所讨论的函数是
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的文章时,我发现了这一点,但回答起来太慢了。出于某种原因,我认为国旗的顺序无关紧要。