ndk-build时各种诡异的undefined reference--

时间:2021-11-20 16:55:35

ndk-build时各种诡异的undefined reference解决方法

在编译自己编码的AndroidRTSP播放器网络库时,网络库引用到了Android NDK编译出的live555子模块库,编译会遇到遇到报各种 undefined reference to xxxx方法, 但是这些方法有都存在live555的各个模块的库中

我想看编译出来的o文件, 那个c文件对应的o文件存在,Android.mk文件也是经过各种验证的,,引用库也引用到了.
结果网上查资料查到有一种说法说是引用库的顺序问题, 越基础的库就越要写到后面. 根据这种说法修改库引用顺序,live555中各个模块库的引用顺序,:

liveMedia  groupsock  BasicUsageEnvironment  UsageEnvironment

当然最基础的引用库放在最后面,再次编译结果OK了…,顺利生成了库文件,虽然还不能调用成功...

注:

ndk 构建注意事项

ndk 构建注意事项

1, Android.mk 和 Application.mk 的默认位置放在 jni,最好不要改这个位置,不然后果很严重!

2, 生成一个静态库(.a)一定要在 Application.mk 中加入 APP_MODULES := libxxmod, 不然执行 ndk-build 没一点儿反应

3, LOCAL_C_INCLUDES 中的目录最好这样写 LOCAL_C_INCLUDES := $(LOCAL_PATH)/../xxlib/include, 不然不在 jni 目录下 启动 ndk-build,则找不到那些 .h

4, 为了支持 exceptions 和 rtti 特性 Application.mk 中要加入 APP_STL := gnustl_static 或者 APP_STL := gnustl_shared
5, 编译 Lua 5.2 需要定义宏 LOCAL_CFLAGS += -D"getlocaledecpoint()='.'" 不然 llex.c:214 会编译失败, 原因是 ndk 自带的 Bionic C 库 localeconv 函数返回的 struct lconv 是个空结构
6, 编译 Freetype 需要定义宏 LOCAL_CFLAGS += -DFT2_BUILD_LIBRARY, 不然不会 #include <freetype/internal/internal.h> 导致编译失败

7, 多个静态库链接成一个动态库时 LOCAL_STATIC_LIBRARIES 中的顺序和库之间的依赖顺序有关系, 不然会链接不成功, 而且在 include xx-prebuilt.mk 是不要用 $(LOCAL_PATH), 因为可能这个被修改, 导致莫名其名的找不到 .mk, 应该这样

CONST_PATH := $(call my-dir)
...
include $(BUILD_SHARED_LIBRARY)
...
include $(CONST_PATH)/../../xx/jni/xx-prebuilt.mk

include $(CONST_PATH)/../../yy/jni/yy-prebuilt.mk

ps: LOCAL_STATIC_LIBRARIES 中的顺序和那个和依赖关系有关系,越基础的库放在越后面!!!