默认情况下,librtmp compile会生成librtmp.so.1
文件和符号链接librtmp.so
。我需要librtmp.so而不带数字后缀,因为andorid不支持它。
我能够修改Makefile以获取librtmp.so文件:
#SO_VERSION=1
#SO_posix=.${SOX}.${SO_VERSION}
SO_posix=${SOX}
所以文件生成的文件现在是librtmp.so
但是Android无法加载它,因为它仍然尝试加载librtmp.so.
(带点):
Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: link_image[1891]: 170 could not load needed library 'librtmp.so.' for 'libffmpeg.so' (load_library[1093]: Library 'librtmp.so.' not found)
答案 0 :(得分:2)
如果共享库的DT_SONAME
动态标记为foobar.so.56
,则无论您使用实际文件(例如foo.so
或libbar.so
)调用什么,要链接可执行文件的库,SONAME
会记录在可执行文件中(作为DT_NEEDED
动态标记),而不是实际的文件名。
以下是librtmp.so
DT_SONAME
librtmp.so.
readelf -d librtmp.so | grep SONAME
。您可以通过以下方式确认:
SONAME
那么你需要做些什么才能摆脱-Wl,--soname=...
?摆脱Makefile
中某处的SONAME
。
如果可执行文件使用
,我该如何检查它?SONAME
或文件名
可执行文件将始终使用DT_NEEDED
(如果存在)。您可以通过在可执行文件的动态部分中查找readelf -d a.out | grep NEEDED
标记来检查可执行文件所需的库:
{{1}}