在我的最新项目中,我遇到了一个关于对共享库方法的未定义引用的奇怪问题。 我搜索了SO,但我能找到的只是C ++相关(extern“C”)或者没有真正帮助。
有问题的库是我的libosm分支,它使用protobuf以二进制格式(.osm.pbf)为OpenStreetMap数据生成去/序列化代码。 有问题的函数是osmpbf__blob__unpack
但这只是我最终使用的第一个,所以我怀疑它是一个普遍的问题。
我用nm
检查了生成的libosm.a
,并且该方法在那里并导出但由于某种原因在链接时找不到它。 以下是我目前的旗帜。 我尝试更改顺序,甚至包括所有库两次(如另一个线程中所示),但我总是以未定义的引用结束。
CFLAGS = -v -std=c99 -O3 -Wall -Wextra -pedantic LIBFLAGS = -losmpbf -lprotobuf-c -lz -lpthread
目前我对错误可能很遗憾,但我认为这可能是一个小错误。 自从我使用C以来已经有一段时间..任何帮助将不胜感激。
干杯,弗洛里安
编辑:这是我完整的Makefile。 我刚刚LIBFLAGS
了变量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之后。
以上就是c/c++开发分享链接静态C库时未定义的引用相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/522934.html