Android NDK.Build 命令失败。未定义引用。铛++ : error: linker command failed with exit code 1

标签 android c++ cmake android-ndk ninja

当我尝试使用 add_library(mycpp-lib ...)add_library(native-lib ...) 创建单独的库时出现此错误.当我使用单个 add_library() 构建时,我没有收到错误。

注意:两个库(libmycpp-lib.so 和 libnative-lib.so)都已成功生成。

这是我遇到的错误:

Build command failed.
Error while executing process /Users/vk/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja with arguments {-C /Users/vk/Development/MyNativeApp1/app/.cxx/cmake/debug/arm64-v8a mycpp-lib native-lib}
ninja: Entering directory `/Users/vk/Development/MyNativeApp1/app/.cxx/cmake/debug/arm64-v8a'
[1/2] Building CXX object CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o
[2/2] Linking CXX shared library ../../../../build/intermediates/cmake/debug/obj/arm64-v8a/libnative-lib.so
FAILED: ../../../../build/intermediates/cmake/debug/obj/arm64-v8a/libnative-lib.so 
: && /Users/vk/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=aarch64-none-linux-android21 --gcc-toolchain=/Users/vk/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64 --sysroot=/Users/vk/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -fPIC -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -fno-addrsig -Wa,--noexecstack -Wformat -Werror=format-security   -O0 -fno-limit-debug-info  -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libatomic.a -static-libstdc++ -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -Wl,-z,noexecstack -shared -Wl,-soname,libnative-lib.so -o ../../../../build/intermediates/cmake/debug/obj/arm64-v8a/libnative-lib.so CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o  -llog -latomic -lm && :
CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o: In function `Java_vikas_example_com_mynativeapp1_MainActivity_stringFromJNI':
/Users/vk/Development/MyNativeApp1/app/.cxx/cmake/debug/arm64-v8a/../../../../src/main/cpp/native-lib.cpp:14: undefined reference to `addtwo(int, int)'
/Users/vk/Development/MyNativeApp1/app/.cxx/cmake/debug/arm64-v8a/../../../../src/main/cpp/native-lib.cpp:16: undefined reference to `array_pointer(int*, int)'
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.

这是我的 CMakeLists.txt:

cmake_minimum_required(VERSION 3.4.1)
set(CMAKE_VERBOSE_MAKEFILE on)

aux_source_directory(src/main/cpp/cpp_basic/airthmatic CPP_SRC)
aux_source_directory(src/main/cpp/cpp_basic CPP_BASIC_SRC)

include_directories(src/main/cpp/cpp_basic/airthmatic)
include_directories(src/main/cpp/cpp_basic)

add_library( # Sets the name of the library.
        native-lib

        # Sets the library as a shared library.
        SHARED

        # Provides a relative path to your source file(s).
        src/main/cpp/native-lib.cpp
        )

find_library( # Sets the name of the path variable.
        log-lib

        # Specifies the name of the NDK library that
        # you want CMake to locate.
        log)

add_library(mycpp-lib

            SHARED

        ${CPP_SRC}
        ${CPP_BASIC_SRC})


target_link_libraries( # Specifies the target library.
        native-lib


        ${mycpp-lib}

        ${log-lib}

        )

最佳答案

mycpp-lib目标名称不是用 set() 定义的变量命令,所以用 ${mycpp-lib} 扩展它产生一个空字符串。使用 target_link_libraries() 时,您可以在链接先前定义的目标时简单地输入目标名称(不带 ${} ):

target_link_libraries( # Specifies the target library.
        native-lib
        mycpp-lib
        ${log-lib}
        )

注意,对于 log-lib确实需要${}扩展 find_library() 定义的缓存变量打电话。

关于Android NDK.Build 命令失败。未定义引用。铛++ : error: linker command failed with exit code 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58837976/

相关文章:

android-studio - 使用 Android Studio 进行 Oculus 开发的最佳示例应用程序?

cmake - CMake引发错误:无法加载缓存

java - 在 fragment 中使用外部字体

java - IntentBuilder(Context,ComponentName) 在 IntentBuilder 中具有私有(private)访问权限

android - 如何使用卸载 Activity 完成 Android 应用程序的实际卸载/删除?

c++ - 访问 std::vector 容器内的数据

java - 如何从另一个类更改 imageview 源?

c++ - IDISPATCH::Invoke 调用方法失败,错误 0x80020005 类型不匹配

c++ - 如何将 iostream 从二进制模式切换到文本模式,反之亦然?

c++ - x64 上 Boost 1.60 和 VS 2013 的链接器错误