【问题标题】:'undefined reference to' the function using Android Studio NDK使用 Android Studio NDK 对函数的“未定义引用”
【发布时间】:2018-02-24 02:16:26
【问题描述】:

我有 3 个类,native-lib.cpp、tracker.cpp 和 tracker.hpp, 但是,如果我在 navtive-lib.cpp 中使用 tracker.cpp 中的 isTracking 函数,则会在构建过程中出错。

  • 出了什么问题: 任务 ':app:externalNativeBuildDebug' 执行失败。

    构建命令失败。 使用参数执行进程 /home/user/Android/Sdk/cmake/3.6.4111459/bin/cmake 时出错 {--build /home/user/AndroidStudioProjects/project/app/.externalNativeBuild/cmake/debug/x86 --target跟踪器} [1/2] 构建CXX对象CMakeFiles/tracker.dir/src/main/cpp/native-lib.cpp.o [2/2] 链接 CXX 共享库 ../../../../build/intermediates/cmake/debug/obj/x86/libtracker.so 失败: : && /home/user/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ --target=i686-none-linux-android --gcc-toolchain=/home/用户/Android/Sdk/ndk-bundle/toolchains/x86-4.9/prebuilt/linux-x86_64 --sysroot=/home/user/Android/Sdk/ndk-bundle/sysroot -fPIC -isystem /home/user/Android/ sdk/ndk-bundle/sysroot/usr/include/i686-linux-android -D__ANDROID_API__=23 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -Wa, --noexecstack -Wformat -Werror=format-security -O0 -fno-limit-debug-info -Wl,--exclude-libs,libgcc.a --sysroot /home/user/Android/Sdk/ndk-bundle/platforms /android-23/arch-x86 -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--no-undefined -Wl,-z,noexecstack - Qunused-arguments -Wl,-z,relro -Wl,-z,now -shared -Wl,-soname,libtracker.so -o ../../../../build/intermediates/cmake/debug/ obj/x86/libtracker.so CMakeFiles/tracker.dir/src/main/cpp/tracker.cpp.o CMakeFiles/tracker.dir/src/main/cpp/native-lib.cpp.o /home/user/Android/Sdk/ndk-bundle/platforms/android-23/arch-x86/usr/lib/liblog.so 。 ./../../../src/main/jniLibs/x86/libopencv_java3.so -lm "/home/user/Android/Sdk/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/库/x86/libgnustl_static.a" && : /home/user/AndroidStudioProjects/project/app/src/main/cpp/native-lib.cpp:28:错误:未定义对“Tracker::isTracking()”的引用 铿锵++:

错误:链接器命令失败,退出代码为 1(使用 -v 查看调用) 忍者:构建停止:子命令失败。

我的 CMakeLists

set (pathToOpenCv /home/user/OpenCV-android-sdk3.2) set (pathToProject /home/user/AndroidStudioProjects/project)

cmake_minimum_required(VERSION 3.4.1)

set(CMAKE_VERBOSE_MAKEFILE on)

include_directories(${pathToOpenCv}/sdk/native/jni/include)

FILE(GLOB_RECURSE cppfiles "/home/user/AndroidStudioProjects/project/app/src/main/cpp/*.cpp")

add_library(lib_opencv SHARED IMPORTED)

add_library(tracker SHARED ${cppfiles})

set_target_properties(lib_opencv PROPERTIES IMPORTED_LOCATION ${pathToProject}/app/src/main/jniLibs/${ANDROID_ABI}/libopencv_java3.so)

find_library( log-lib

              log ) target_link_libraries(
                       tracker

                       ${log-lib}

                       lib_opencv
                       )

这是我的 native-lib.cpp

#include <jni.h>
#include <string>
#include "tracker.hpp"

using namespace cv;

Tracker tracker;

extern "C"
JNIEXPORT jboolean JNICALL
Java_com_example_user_project_Tracker_isTrackingC(JNIEnv *env, jboolean boolean) {
    boolean = tracker.isTracking();
    return boolean;
}

可能是什么原因,CMake 无法从 native-lib 中的 tracker.cpp 找到我的函数? 我想我通过在 CMakeLists 中使用 add_library(tracker SHARED ${cppfiles}) 和 target_link_libraries 将我所有的 cpp 链接在一起。

【问题讨论】:

  • 我相信这是因为tracker 从未被初始化。
  • 您是否尝试将FILE(GLOB_RECURSE) 行替换为您的源文件列表?您不必输入完整路径,只要 CMakeLists.txt 与 .cpp 文件位于同一文件夹中,就可以使用文件名。它看起来很可疑,好像 tracker.cpp 没有被编译。你也可以发tracker.cpptracker.hpp吗?
  • 不了解 clang,但如果它的行为类似于 gcc,那么您的目标文件顺序错误。
  • 谢谢,现在可以使用了。我没有初始化 Tracker.cpp 中的 isTracking() 函数,而只初始化了 Tracker.hpp。我认为这是我在 CMakelists 中的问题,昨天没有检查我的 cpp。

标签: c++ cmake android-ndk java-native-interface


【解决方案1】:

“链接 CXX 共享库 ../../../../build/intermediates/cmake/debug/obj/x86/libtracker.so 失败” 这是关键。 “--target=i686-none-linux-android” 也许你的项目编译工具链应该使用 32 位

【讨论】:

    【解决方案2】:

    谢谢大家。在阅读了 Zamrony 和 MultipleMonomials 的 cmets 之后, 我再次检查了Tracker.cppTracker.hpp。我发现我在 hpp 上声明了isTracking(),但没有在 .cpp 文件中定义它。在.cpp文件中实现该功能后,它工作正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-26
      • 2014-12-21
      • 1970-01-01
      • 2012-07-18
      • 1970-01-01
      • 1970-01-01
      • 2019-03-08
      相关资源
      最近更新 更多