Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
链接共享C库时出现Android NDK错误_Android_Cmake_Android Ndk_Java Native Interface - Fatal编程技术网

链接共享C库时出现Android NDK错误

链接共享C库时出现Android NDK错误,android,cmake,android-ndk,java-native-interface,Android,Cmake,Android Ndk,Java Native Interface,我正在尝试将一些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( # Specif

我正在尝试将一些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_库中的所有文件时发生的,除了main之外,main与其他无法链接的文件位于同一目录中


我遗漏了什么?

我认为您误解了cmake语法。下面的内容就足够了

target_link_libraries(
    main
    ${log-lib})
下面是源文件,而不是库名称

communication_api
cybtldr_api
cybtldr_parse
cybtldr_command
所以,你的陈述是不正确的

如果您想减少混淆,请尝试进行以下更改

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项目,以备您需要:

我想您误解了cmake语法。下面的内容就足够了

target_link_libraries(
    main
    ${log-lib})
下面是源文件,而不是库名称

communication_api
cybtldr_api
cybtldr_parse
cybtldr_command
所以,你的陈述是不正确的

如果您想减少混淆,请尝试进行以下更改

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项目,以备您需要:

当您没有该库时,为什么要在target\u link\u libraries调用中将cybtldr\u命令指定为库?您有一个文件cybtldr_command.c,它是库的源文件。错误消息正是关于您指定的缺少的库的。当您没有该库时,为什么在目标链接库调用中将cybtldr\u命令指定为库?您有一个文件cybtldr_command.c,它是库的源文件。错误消息与您指定的缺少库完全相关。