Android/Linux上加载的动态.so vs.so.NUMBER库

Android/Linux上加载的动态.so vs.so.NUMBER库,android,linux,gcc,shared-libraries,Android,Linux,Gcc,Shared Libraries,我是从源代码处编译gstreamer1.4.4的,通过使用configure-host=armlinux androideabi标志来获取arm.so和.a二进制文件。 然后我使用gst android 0.10构建工具将库链接到gstreamer_android.so。 那很好。 问题是我不知道如何在Android上部署gst-rtsp-server.so。所有库都嵌入到.so文件中,但此库不依赖于gstreamer_和id.so,但: 0x00000001 (NEEDED)

我是从源代码处编译gstreamer1.4.4的,通过使用configure-host=armlinux androideabi标志来获取arm.so和.a二进制文件。 然后我使用gst android 0.10构建工具将库链接到gstreamer_android.so。 那很好。 问题是我不知道如何在Android上部署gst-rtsp-server.so。所有库都嵌入到.so文件中,但此库不依赖于gstreamer_和id.so,但:

0x00000001 (NEEDED)                     Shared library: [libgstreamer-1.0.so.0]
0x00000001 (NEEDED)                     Shared library: [libgio-2.0.so.0]
0x00000001 (NEEDED)                     Shared library: [libgobject-2.0.so.0]
0x00000001 (NEEDED)                     Shared library: [libglib-2.0.so.0]
0x00000001 (NEEDED)                     Shared library: [libintl.so.8]
0x00000001 (NEEDED)                     Shared library: [libm.so]
0x00000001 (NEEDED)                     Shared library: [libc.so]
0x00000001 (NEEDED)                     Shared library: [libdl.so]
0x0000000e (SONAME)                     Library soname: [libgstrtsp-1.0.so.0]
即使我创建了定制的Android.mk并将本地共享库指向gstreamer\u Android.so

所以我不知道如何从gstreamer_android.So注册libgstreamer-1.0.So.0,或者将gstrtspserver.So附加到gstreamer_android.So中。我后来尝试添加到gst android的android.mk中,但随后出现以下错误:

gst-build-armeabi/gstreamer_android.o:gstreamer_android.c:function gst_android_register_static_plugins: error: undefined reference to 'gst_plugin_rtspserver_register'
很明显我做错了什么,有人能给我指出正确的方向吗?
谢谢。

首先,您需要了解外部库版本控制。我觉得很有帮助

其次,您需要认识到libintl.so没有命名为libintl.so.8可能是有原因的——它们可能与ABI不兼容。重命名或创建从libintl.so到libintl.so.8的符号链接将导致找到它,但可能会导致运行时崩溃

最后,您依赖libintl.so.8的原因可能是在链接时您使用了错误的libintl.so,它的SONAME为libintl.so.8而不是libintl.so。你是用gnulib自己构建这个libintl.so的吗?android树中可能有不同的版本。

确定找到了解决方案, 在gst-android/ndk-build/gstreamer-1.0.mk中添加这样的内容已经足够了

GSTREAMER_RTSP_SERVER_LIBS := -Wl,--whole-archive /path/to/gst-rtsp-server-1.4.4/gst/rtsp-server/.libs/libgstrtspserver-1.0.a
然后将此标志附加到GSTREAMER_ANDROID_LIBS,如下所示:

GSTREAMER_ANDROID_LIBS := $(GSTREAMER_RTSP_SERVER_LIBS) $(call fix-deps,-lgiognutls, -lhogweed)
如果您需要一个定制的Android.mk来构建RTSP服务器,这里有一个


谢谢你的回答。我的库应该是ABI兼容的。我试图发布问题的简化版本:我从源代码交叉编译gstreamer,包括glib和所有其他依赖项。一切看起来都很好,只是我在运行时出现了这个错误。也许我可以使用-h选项从您的链接在甲骨文的文件。如果我重命名库以匹配版本,我会得到SIGSEGV和消息,如:E/GLib+GLib-GObject8033:g_param_spec_uint64:assertion'default_value>=minimum&&default_value找到了我问题的解决方案:一些库与x64版本的GLib链接,而不是我想要的ARM版本。我通过设置GLIB_CFLAGS和GLIB_LIBS env解决了这个问题。配置脚本调用的变量。编辑我的问题以更清楚地了解我要做什么