android - 链接共享 C 库时出现 Android NDK 错误
问题描述
我正在尝试将一些 C 文件链接到我正在处理的 NDK 项目,并将我的CMakeLists.txt
文件设置如下。
cmake_minimum_required(VERSION 3.4.1)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 -Wall")
find_library( # Sets the name of the path variable.
log-lib
log)
add_library( # Specifies the name of the library.
main SHARED
main.c
communication_api.c
cybtldr_api.c
cybtldr_parse.c
cybtldr_command.c
)
target_link_libraries(main
communication_api
cybtldr_api
cybtldr_parse
cybtldr_command
${log-lib})
我在链接这些库的步骤中遇到错误
[6/6] Linking C shared library /Users/rafa/Code/Labconco-FreezeDry-Android-Refactor/app/build/intermediates/cmake/debug/obj/x86/libmain.so
而且错误很长
FAILED: : && /Users/rafa/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=i686-none-linux-android19 --gcc-toolchain=/Users/rafa/Library/Android/sdk/ndk-bundle/toolchains/x86-4.9/prebuilt/darwin-x86_64 --sysroot=/Users/rafa/Library/Android/sdk/ndk-bundle/sysroot -fPIC -isystem /Users/rafa/Library/Android/sdk/ndk-bundle/sysroot/usr/include/i686-linux-android -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -Wa,--noexecstack -Wformat -Werror=format-security -std=c99 -Wall -O0 -fno-limit-debug-info -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libatomic.a -nostdlib++ --sysroot /Users/rafa/Library/Android/sdk/ndk-bundle/platforms/android-19/arch-x86 -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -L/Users/rafa/Library/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/libs/x86 -Wl,--no-undefined -Wl,-z,noexecstack -Qunused-arguments -Wl,-z,relro -Wl,-z,now -shared -Wl,-soname,libmain.so -o /Users/rafa/Code/Labconco-FreezeDry-Android-Refactor/app/build/intermediates/cmake/debug/obj/x86/libmain.so CMakeFiles/main.dir/main.c.o CMakeFiles/main.dir/communication_api.c.o CMakeFiles/main.dir/cybtldr_api.c.o CMakeFiles/main.dir/cybtldr_parse.c.o CMakeFiles/main.dir/cybtldr_command.c.o -lcommunication_api -lcybtldr_api -lcybtldr_parse -lcybtldr_command -llog -latomic -lm && :
/Users/rafa/Library/Android/sdk/ndk-bundle/toolchains/x86-4.9/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x/../../../../i686-linux-android/bin/ld: error: cannot find -
lcommunication_api
/Users/rafa/Library/Android/sdk/ndk-bundle/toolchains/x86-4.9/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x/../../../../i686-linux-android/bin/ld: error: cannot find -lcybtldr_api
/Users/rafa/Library/Android/sdk/ndk-bundle/toolchains/x86-4.9/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x/../../../../i686-linux-android/bin/ld: error: cannot find -lcybtldr_parse
/Users/rafa/Library/Android/sdk/ndk-bundle/toolchains/x86-4.9/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x/../../../../i686-linux-android/bin/ld: error: cannot find -lcybtldr_command
要点是这样
error: cannot find -lcybtldr_command
error: cannot find -lcybtldr_api
error: cannot find -lcybtldr_parse
error: cannot find -lcybtldr_command
当它试图链接所有文件时似乎正在发生这种情况,add_library()
除了main
它与它无法链接的其他文件位于同一目录中之外
我错过了什么?
解决方案
我认为您误解了 cmake 语法。对于您的情况,以下内容就足够了。
target_link_libraries(
main
${log-lib})
以下是源文件,而不是库名称。
communication_api
cybtldr_api
cybtldr_parse
cybtldr_command
所以,你的 cmake 陈述是不正确的。
如果您想减少混乱,请尝试进行以下更改。
find_library( # Sets the name of the path variable.
log-lib
log)
add_library( # Specifies the name of the library.
my-native-lib SHARED
main.c
communication_api.c
cybtldr_api.c
cybtldr_parse.c
cybtldr_command.c
)
target_link_libraries(my-native-lib
${log-lib})
但是,请记住也要更改您的 Java 端,请参见下面的示例:
// Used to load the 'my-native-lib' library on application startup.
static {
System.loadLibrary("my-native-lib");
}
我只是附上我的 JniExample 项目以备不时之需:https ://github.com/russell-shizhen/JniExample
推荐阅读
- go - 如何在不停止和重新启动的情况下部署 Web 应用程序
- javascript - 电子对话框文件路径“\\”到“/”?
- excel - 运行时 438 VBA
- javascript - Woocommerce 产品滑块不显示第二张图片
- ios - Swift IOS - 在设备上测试时如何获得上传文档的权限?
- c# - 访问基类覆盖的 ToString 方法中的子类对象
- sql - 使用 NodeJS + MongoDB(或 SQL)实现搜索算法
- groovy - 当未定义其他 var 时,groovy 使用 var
- angular - 在同一页面角度中多次使用同一组件时避免多次 api 调用
- r - 有没有办法在openxlsx的write.xlsx函数中将默认覆盖改成yes?