问题描述
我在编译A库的时候依赖了其他的B静态库,出现此问题,当A库编译为静态库时无报错,当A库编译为动态库时报错
解决办法
recompile with -fPIC。无法解决R_AARCH64_ADR_PREL_PG_HI21重定向于符号__stack_chk_guard@GLIBC_2.17
如果是有类似这句话的话,那大概率是因为在编译B静态库时没有加上-fPIC选项,而编译A库的时候加了-fPIC选项,导致不兼容。重新编译B静态库,具体应该怎么加参考此篇博文:
https://blog.csdn.net/m0_37876242/article/details/121786076
该博主修改Makefile的方式进行了-fPIC编译,但是发现不仅B的源码主目录下有Makefile,在src和其他目录下依然有Makefile文件,不知道只改主目录下的Makefile是否有用,所以直接在B的主目录下运行 ./comfigure --help 看一下编译选项,–enable-static是编译静态库,–enable-shared是编译动态库,–with-pic好像是以pic的方式编译,所以用configure生成Makefile时加上这三个命令,查看生成的Makefile文件,在CFLAGS =*******这里并没有发现-FPIC这个选项,但是后面确实不报错了。
还是报错
还有可能就是编译A时依赖的B库顺序不对,例如B库还依赖C库,关系为:A->B->C,那么不仅C需要加-fPIC选项,并且在编译A时,引库方式应该为:
-B -C
,也就是先依赖B,再依赖C,我在这里卡了两天。。。。最后无意间才发现自己编译A的Makefile依赖库顺序写反了!!
还是报错
在编译A时在编译命令末尾加上-lpthread -lrt -ldl -rdynamic -lstdc++ -lm
还是报错
一般到这里接差不多了,还报这个错误我也无能为力了,欢迎大家留言讨论互帮互助。