CANNOT LINK EXECUTABLE 错误。如何将运行时库添加到 NDK 编译代码
Posted
技术标签:
【中文标题】CANNOT LINK EXECUTABLE 错误。如何将运行时库添加到 NDK 编译代码【英文标题】:CANNOT LINK EXECUTABLE error. How to Add Runtime Libs to NDK Compiled Code 【发布时间】:2021-02-22 20:59:37 【问题描述】:我有一个 c++ 应用程序,特别是一个设备驱动程序(无 gui),我为 linux 编写并使用 makefile 构建。我希望这个驱动程序能够在 android 设备(运行 android 29 的 arm64)上运行,所以我通过使用我的 makefile 中的 android NDK 独立工具链在我的 linux 机器上成功编译了驱动程序,并喜欢适当的 arm64 依赖项。
当我通过 adb shell 将代码推送到 android 并尝试运行时,出现错误:
CANNOT LINK EXECUTABLE "./gdriver": library "libudev.so.1" not found
驱动程序有一大堆类似的依赖关系,所以我有一些问题: 我在哪里放置库/头文件,以便 android 可以在运行时找到它们? 有没有办法将我编译的 NDK 可执行文件与库打包为 Android Studio 中的 apk 或类似文件? 有没有办法把它包装好让它开箱即用?
【问题讨论】:
【参考方案1】:有没有办法将我编译的 NDK 可执行文件与库一起打包为 Android Studio 中的 apk 或类似文件?
我看到以下最简单的方法:
-
在 AS 中创建新项目:
Select a Project Template -> Native C++
重做您的 cmake 以获取可执行文件 gdriver
以编译库 libgdriver.so
代替
从Java_com_example_myapplication_MainActivity_stringFromJNI
中的libgdriver.so
调用你的入口函数(函数来自libnative-lib.so
的AS模板代码)
在native-lib
cmake 中添加链接库:
target_link_libraries(native-lib gdriver udev)
这只是一个示例,您可以根据需要实现它,例如根本不需要native-lib
,但重点是重新编译您的可执行文件,如库并从 Activity 调用其入口函数(在我们的例子中是通过 JNI) .您的所有库都将成为 APK 的一部分。
【讨论】:
【参考方案2】:许多版本的 Android 不会使用不遵循 lib*.so
模式的原生库。问题可能出在您的库名称上。
【讨论】:
以上是关于CANNOT LINK EXECUTABLE 错误。如何将运行时库添加到 NDK 编译代码的主要内容,如果未能解决你的问题,请参考以下文章
用C++编程有错误LINK : fatal error LNK1104: cannot open file "Debug/123.exe"如何解决?
LINK : fatal error LNK1104: cannot open file 'mfcs42d.lib'
Cannot create PoolableConnectionFactory (Communications link failure The last packet sent successfu
VC6 LINK : fatal error LNK1168: cannot open Debug/Test.exe for writing
C++学习(二六五)link_libraries和target_link_libraries
LINK : fatal error LNK1168: cannot open Debug/1.exe for writing