最近一直在改造一些库使用musl静态链接
三大坑:
1、在头文件中声明并且初始化的一堆变量(主要是接口的GUID)。
这在*.so里貌似没问题,在静态库里会报重复定义的符号。
要把声明、初始化拆开,声明放在原来的.h,初始化新搞一个.cpp来集中存放。
msvc有个__declspec(selectany)能救命,gcc/clang只针对windows target才支持这个。
2、如果用到GUI,比如GTK,GTK的库几乎无法静态链接,也不推荐。
GTK自己做了一些weak symbol linking以便尽可能兼容复杂的display环境。
3、依赖全局/静态对象的自动初始化来注册一些查找表的代码(比如类工厂性质的代码)。
在*.so里没问题,在静态库里这些对象由于没有代码显式引用他们,会被优化掉,导致查找表无法建立。
需要统一增加显式引用,如果表格大,是重体力活儿。
2好歹还能提前知道,1、3如果不深入到库代码的里面,是无法事先知道的。跳坑要谨慎。
--
修改:z16166 FROM 222.131.206.*
FROM 222.131.206.*