Android Native构建配置疑问:静态库与共享库互用是否可行及问题
Android Native构建配置场景疑问解答
场景1:静态库通过LOCAL_SHARED_LIBRARIES引用静态库(注:你标注的场景描述是“在共享库中使用静态库”,但代码示例里B为静态库)
是否允许?
这种配置不被允许,属于构建规则误用,会直接导致构建失败。
存在的问题:
- 链接阶段报错:
LOCAL_SHARED_LIBRARIES是用来声明对共享库的依赖,构建系统会尝试查找libA.so,但A被编译为静态库(生成libA.a),找不到对应文件会抛出链接错误。 - 配置逻辑错误:如果你的真实需求是共享库依赖静态库(比如B是共享库,要打包静态库A的代码),正确配置应该是将B的
include $(BUILD_STATIC_LIBRARY)改为include $(BUILD_SHARED_LIBRARY),同时把LOCAL_SHARED_LIBRARIES := A替换为LOCAL_STATIC_LIBRARIES := A,这种配置是合法的,静态库的代码会被合并到共享库B中。
场景2:静态库通过LOCAL_STATIC_LIBRARIES引用共享库
是否允许?
这种配置同样不被允许,违反ndk-build的依赖规则,构建会失败。
存在的问题:
- 链接阶段报错:
LOCAL_STATIC_LIBRARIES用于声明对静态库的依赖,构建系统会尝试查找libA.a,但A是共享库(生成libA.so),无法找到目标文件导致报错。 - 静态库的本质限制:静态库只是目标文件的集合,本身不会进行动态链接,无法将共享库的代码嵌入到静态库中。如果静态库B需要使用共享库A的功能,正确做法是在B中用
LOCAL_SHARED_LIBRARIES := A声明依赖,此时B本身不会链接A,但当最终的可执行文件或共享库依赖B时,会自动带上对A的依赖,在运行时加载libA.so。
内容的提问来源于stack exchange,提问作者teahyung kim
相关产品推荐
相关产品推荐

