Google Project Tango NDK 未定义函数参考
Posted
技术标签:
【中文标题】Google Project Tango NDK 未定义函数参考【英文标题】:Google Project Tango NDK undefined reference on functions 【发布时间】:2017-09-07 13:00:37 【问题描述】:我得到一个编译错误:
undefined reference to 'TangoService_getConfig' (MoreTeapotsNativeActivity.cpp)
ld returned 1 exit status (collect2.exe)
我正在使用 VisualGDB 在 Visual Studio 2015 中使用 tango sdk TangoSDK_Ikariotikos_C.zip。我还在 android Studio 中复制了该错误,因此它不是特定于 IDE 的。
我已经开始使用 NDK 示例项目来测试本机活动是否正确部署,并在排除故障时降低复杂性。我使用了 VisualGDB MoreTeaPotsNativeActivity,但任何都可以。该应用程序在我们的 ASUS Zenfone AR 上编译和运行。一旦我包含 tango_client_api.h 并添加以下代码,就会出现编译错误:
TangoCoordinateFramePair* Tango_FramePair;
Tango_FramePair = new TangoCoordinateFramePair();
Tango_FramePair->base = TANGO_COORDINATE_FRAME_START_OF_SERVICE;
Tango_FramePair->target = TANGO_COORDINATE_FRAME_DEVICE;
TangoErrorType retval;
// Connect to tango service.
TangoConfig tango_config;
tango_config = TangoService_getConfig(TANGO_CONFIG_DEFAULT);
Tango 头文件有一个用于 C 函数的外部“C”包装器,并且 .o 显示它们已解构,所以我看不出它失败的原因。 如果我注释掉...
//tango_config = TangoService_getConfig(TANGO_CONFIG_DEFAULT);
...它编译并且枚举在调试中显示为本地,所以它似乎是函数的问题:see image of locals here
我可能遗漏了一些非常明显的东西,因为 android 对我来说相当新。也许有人可以使用相同的代码块测试 tangoSDK 库并发现问题。令人沮丧的是,我什至无法链接库。我可能遗漏了一些简单的东西,但对我来说并不明显。
任何帮助将不胜感激。
【问题讨论】:
【参考方案1】:我联系了 Sysprogs 支持,他们给了我一个链接: PREBUILT_SHARED_LIBRARY syntax
即使智能感知正在读取标题,我也没有意识到库没有被复制。我需要在 make 文件(android.mk)中包含一个引用来复制库(我将 Tango 包含和 lib 文件夹复制到项目 jni 文件夹):
include $(CLEAR_VARS)
LOCAL_MODULE := tango_client_api
LOCAL_SRC_FILES := ../jni/lib/$(TARGET_ARCH_ABI)/libtango_client_api.so
include $(PREBUILT_SHARED_LIBRARY)
我对支持库的附加块做了同样的事情:
include $(CLEAR_VARS)
LOCAL_MODULE := tango_support_api
LOCAL_SRC_FILES := ../jni/lib/$(TARGET_ARCH_ABI)/libtango_support_api.so
include $(PREBUILT_SHARED_LIBRARY)
主模块只需要这个:
LOCAL_SHARED_LIBRARIES := tango_client_api
整个文件如下所示:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := tango_client_api
LOCAL_SRC_FILES := ../jni/lib/$(TARGET_ARCH_ABI)/libtango_client_api.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := tango_support_api
LOCAL_SRC_FILES := ../jni/lib/$(TARGET_ARCH_ABI)/libtango_support_api.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := MoreTeapotsNativeActivity
#VisualGDBAndroid: AutoUpdateSourcesInNextLine
LOCAL_SRC_FILES := gdbserver_launcher.c MoreTeapotsNativeActivity.cpp MoreTeapotsRenderer.cpp
LOCAL_C_INCLUDES := jni/include
LOCAL_LDLIBS := -llog -landroid -lEGL -lGLESv2
LOCAL_STATIC_LIBRARIES := cpufeatures android_native_app_glue ndk_helper
LOCAL_SHARED_LIBRARIES := tango_client_api
include $(BUILD_SHARED_LIBRARY)
$(call import-module,android/ndk_helper)
$(call import-module,android/native_app_glue)
$(call import-module,android/cpufeatures)
在遵循 NDK 示例时,我并没有立即让这个工作,但 Sysprogs 给了我关于我的错误的反馈,我将包括在内。
我试图包括:
LOCAL_MODULE_FILENAME := tango_client_api
我离开了 lib 和 .so 似乎是约定俗成的。 .so 不是必需的,但关闭 lib 会更改导致链接错误的文件名。也就是说,那条线首先是不必要的,因为我删除了它。然后它删除了与此相关的错误。我还没有查看该库是否在运行时工作,因为我现在收到此错误:
java.lang.UnsatisfiedLinkError: Unable to load native library "/data/app/com.sample.moreteapots-2/lib/arm64/libMoreTeapotsNativeActivity.so": dlopen failed: library "libbinder.so" not found
但这似乎与 Android 7.0 平台 24 及更高版本的问题有关
系统阻止应用动态链接非 NDK 库
来自 /Android/android-sdk/docs/about/versions/nougat/android-7.0-changes.html
【讨论】:
以上是关于Google Project Tango NDK 未定义函数参考的主要内容,如果未能解决你的问题,请参考以下文章