Xamarin - 尝试加载 libtbb.so 导致 "libc.so" 在运行时找不到消息
Xamarin - attempt to load libtbb.so results in "libc.so" not found message in runtime
我正在使用 Xamarin.Forms 开发应用程序,目前正在 Android phone(Android 6,armeabi-v7a)上对其进行测试。目标 API 是 21,我的开发机器运行 Windows。我还使用了几个由 NDK 构建的本机库,但为了隔离,我创建了一个小库,它只做 return 来自单个导出函数的数字。
现在我需要 link 英特尔 TBB 库到我的本地库,所以我使用 ndk 构建工具构建了一个并克隆了 TBB 存储库:
ndk-build target=android tbb tbb_os=windows arch=armeabi-v7a
这导致了 libtbb.so
和 libtbb_debug.so
库,然后我将它们作为 AndroidNativeLibrary
添加到我的 Xamarin Android 项目中,另外设置 <Abi>armeabi-v7a</Abi>
并复制到目标目录,编译并部署到我的 phone.
另外我在 C# 中有一些测试代码只是为了调用本机库(在没有 linking TBB 的情况下工作正常)。
这是问题所在 - 在 linking TBB 之后(即使没有实际使用来自 TBB 库的任何东西),当尝试使用消息加载本机库时代码崩溃:
DllImport error loading library 'libmyproject_experimental.so': 'dlopen failed: cannot find "libc.so" from verneed[0] in DT_NEEDED list for "/data/app/com.example.myapp.myproject-1/lib/arm/libtbb.so"'.
所以我在我的 Xamarin 项目中为 TBB 创建了一个新项目,添加了 TBB 源,设置了正确的标志,因此代码构建正确(我设置了与 ndk-build 输出中相同的标志)并添加了 TBB 项目参考我的实验图书馆。这只是将问题从 TBB 转移到我的图书馆:
DllImport error loading library 'libmyproject_experimental.so': 'dlopen failed: cannot find "libc.so" from verneed[0] in DT_NEEDED list for "/data/app/com.example.myapp.myproject-1/lib/arm/libmyproject_experimental.so"'.
我还在所有地方将 STL 更改为 libc++_shared,启用异常和 RTTI,并将 c++1y 设置为 C++ 标准。我也在使用 clang 5.0.
有什么解决这个问题的想法吗?
编辑:当我在 MSVS 中构建 TBB 作为静态库时,消息现在说,它找不到 "libm.so"(TBB 也需要)
回答我自己的问题:
我通过重新配置项目和以下一些方法解决了这个问题:
- 将 TBB 库构建为静态库
- 使用 libc++ 的静态版本
- 将最低 API 级别提高到 21(以前是 19)
但是,我不确定真正的问题是什么。
编辑:进行静态链接的一般想法来自这里:https://software.intel.com/en-us/forums/intel-threading-building-blocks/topic/623425
我正在使用 Xamarin.Forms 开发应用程序,目前正在 Android phone(Android 6,armeabi-v7a)上对其进行测试。目标 API 是 21,我的开发机器运行 Windows。我还使用了几个由 NDK 构建的本机库,但为了隔离,我创建了一个小库,它只做 return 来自单个导出函数的数字。
现在我需要 link 英特尔 TBB 库到我的本地库,所以我使用 ndk 构建工具构建了一个并克隆了 TBB 存储库:
ndk-build target=android tbb tbb_os=windows arch=armeabi-v7a
这导致了 libtbb.so
和 libtbb_debug.so
库,然后我将它们作为 AndroidNativeLibrary
添加到我的 Xamarin Android 项目中,另外设置 <Abi>armeabi-v7a</Abi>
并复制到目标目录,编译并部署到我的 phone.
另外我在 C# 中有一些测试代码只是为了调用本机库(在没有 linking TBB 的情况下工作正常)。
这是问题所在 - 在 linking TBB 之后(即使没有实际使用来自 TBB 库的任何东西),当尝试使用消息加载本机库时代码崩溃:
DllImport error loading library 'libmyproject_experimental.so': 'dlopen failed: cannot find "libc.so" from verneed[0] in DT_NEEDED list for "/data/app/com.example.myapp.myproject-1/lib/arm/libtbb.so"'.
所以我在我的 Xamarin 项目中为 TBB 创建了一个新项目,添加了 TBB 源,设置了正确的标志,因此代码构建正确(我设置了与 ndk-build 输出中相同的标志)并添加了 TBB 项目参考我的实验图书馆。这只是将问题从 TBB 转移到我的图书馆:
DllImport error loading library 'libmyproject_experimental.so': 'dlopen failed: cannot find "libc.so" from verneed[0] in DT_NEEDED list for "/data/app/com.example.myapp.myproject-1/lib/arm/libmyproject_experimental.so"'.
我还在所有地方将 STL 更改为 libc++_shared,启用异常和 RTTI,并将 c++1y 设置为 C++ 标准。我也在使用 clang 5.0.
有什么解决这个问题的想法吗?
编辑:当我在 MSVS 中构建 TBB 作为静态库时,消息现在说,它找不到 "libm.so"(TBB 也需要)
回答我自己的问题:
我通过重新配置项目和以下一些方法解决了这个问题:
- 将 TBB 库构建为静态库
- 使用 libc++ 的静态版本
- 将最低 API 级别提高到 21(以前是 19)
但是,我不确定真正的问题是什么。
编辑:进行静态链接的一般想法来自这里:https://software.intel.com/en-us/forums/intel-threading-building-blocks/topic/623425