用weak symbol已经比较长时间,这个功能对于c语言来说其实相当好用。不过最近遇到一个问题,如果一个静态库.o里的函数只有相对于weak的strong函数能被其他.o call到,那这个.o就不会被link到,最终始终会call到weak的那个function。
多次试验和搜索,应该就是静态库的函数只有在要被用到的时候,才会被link,但weak symbol相对比较特殊,会先link到weak的function,然后再去找strong的function。因此strong的function实现在静态库里面,并且对应.o里函数也没被其他.o call 到,整个静态库都不会被link进去,因此最后只会选weak function。
应对的方式
A:利用—whole-archive和—no-whole-archive强制静态库被link进去,这样strong函数一定会被收到。缺点是如果lib之间有同名function会打出build error
B:和A类似,利用link选项-u强制某个function被link,但lib和function较多时不好用
最后附上相关一些ld option及简单说明:
—start-group —end-group》resolve circular dependency,处理gcc .o之间有依赖关系时,因为link顺序引起build error
—whole-archive —no-whole-archive》在这两个option之间,会把静态库的symbol提前link进来,平常只有被call到在会link进去
link时的-u symbol_name强制keep该symbol