android - 如何使有关 undefined reference 的错误日志更详细

标签 android c++ c android-ndk cygwin

我需要编译一些 C/C++ 代码。使用NDK和Cygwin的工具,我不止一次想出“undefined reference to”的错误。大多数人说这是由于调用了一个其 lib 文件未包含在源文件中的函数引起的。但是,我对c/c++知之甚少,而且错误日志给出了模糊的信息,所以我不知道是哪个文件中哪一行导致了问题,甚至不知道我真正需要的是哪个lib文件。

我希望我能找到一些工具或一些方法来处理此类问题,这样我就可以找到错误行或获得有关错误的更多详细信息。

非常感谢。

Android.mk

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
include ../includeOpenCV.mk
ifeq ("$(wildcard $(OPENCV_MK_PATH))","")
#try to load OpenCV.mk from default install location
include $(TOOLCHAIN_PREBUILT_ROOT)/user/share/OpenCV/OpenCV.mk
else
include $(OPENCV_MK_PATH)
endif
LOCAL_MODULE:=AvatarSpeak
LOCAL_SRC_FILES:=AvatarSpeak.cpp
LOCAL_LDLIBS    := -llog
include $(BUILD_SHARED_LIBRARY)

$NDK/ndk-build V=1

$ $NDK/ndk-build V=1
rm -f ./libs/armeabi/lib*.so ./libs/armeabi-v7a/lib*.so ./libs/mips/lib*.so        ./libs/x86/lib*.so
rm -f ./libs/armeabi/gdbserver ./libs/armeabi-v7a/gdbserver ./libs/mips/gdbserver     ./libs/x86/gdbserver
rm -f ./libs/armeabi/gdb.setup ./libs/armeabi-v7a/gdb.setup ./libs/mips/gdb.setup      ./libs/x86/gdb.setup
Gdbserver      : [arm-linux-androideabi-4.6] libs/armeabi/gdbserver
mkdir -p ./libs/armeabi
install -p /cygdrive/d/android-ndk-r8b/prebuilt/android-arm/gdbserver/gdbserver   ./libs/armeabi/gdbserver
Gdbsetup       : libs/armeabi/gdb.setup
mkdir -p ./libs/armeabi
echo "set solib-search-path ./obj/local/armeabi" > ./libs/armeabi/gdb.setup
echo "directory D:/android-ndk-r8b/platforms/android-14/arch-arm/usr/include   "../../OpenCV-2.3.1/share/OpenCV/../../include/opencv" "../../OpenCV-    2.3.1/share/OpenCV/../../include" D:/android-ndk-r8b/sources/cxx-stl/gnu-     libstdc++/4.6/include D:/android-ndk-r8b/sources/cxx-stl/gnu-    libstdc++/4.6/libs/armeabi/include jni" >> ./libs/armeabi/gdb.setup
SharedLibrary  : libAvatarSpeak.so
/cygdrive/d/android-ndk-r8b/toolchains/arm-linux-androideabi-     4.6/prebuilt/windows/bin/arm-linux-androideabi-g++  -Wl,-soname,libAvatarSpeak.so  -shared       --sysroot=D:/android-ndk-r8b/platforms/android-14/arch-arm  ./obj/local/armeabi/objs-      debug/AvatarSpeak/com_huawei_avatar_AvatarSpeak.o ./obj/local/armeabi/libopencv_contrib.a       ./obj/local/armeabi/libopencv_calib3d.a ./obj/local/armeabi/libopencv_objdetect.a       ./obj/local/armeabi/libopencv_features2d.a ./obj/local/armeabi/libopencv_video.a      ./obj/local/armeabi/libopencv_imgproc.a ./obj/local/armeabi/libopencv_highgui.a          ./obj/local/armeabi/libopencv_ml.a ./obj/local/armeabi/libopencv_legacy.a     ./obj/local/armeabi/libopencv_flann.a ./obj/local/armeabi/libopencv_core.a        ./obj/local/armeabi/libopencv_androidcamera.a ./obj/local/armeabi/liblibjpeg.a       ./obj/local/armeabi/liblibpng.a ./obj/local/armeabi/liblibtiff.a      ./obj/local/armeabi/liblibjasper.a ./obj/local/armeabi/libzlib.a       ./obj/local/armeabi/libgnustl_static.a    -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-      z,relro -Wl,-z,now  -LD:/android-ndk-r8b/platforms/android-14/arch-arm/usr/lib -llog -lc -           lm  -o obj/local/armeabi/libAvatarSpeak.so
./obj/local/armeabi/objs-debug/AvatarSpeak/AvatarSpeak.o: In function      `Java_com_hachi_avatar_AvatarSpeak_speak':
D:\eclipse_workspace\TestSo/jni/com_hachi_avatar_AvatarSpeak.cpp:52: undefined     reference to `Fap2Avi2D(char const*, char const*, char const*, char const*, char const*,    int)'
collect2: ld returned 1 exit status
/cygdrive/d/android-ndk-r8b/build/core/build-binary.mk:378: recipe for target     `obj/local/armeabi/libAvatarSpeak.so' failed
make: *** [obj/local/armeabi/libAvatarSpeak.so] Error 1

AvatarSpeak.cpp

if (fImage != NULL && fPot != NULL) {

    bool sucavi = Fap2Avi2D(str3, str5, str4, str1, str2, -1);
    LOGI("sucess and exit!");
} else {
    LOGI("unsucess and exit!");
}

Animation2D_new.h(定义Fap2Avi2D方法的头文件)

#ifndef ANIMATION_2D_NEW_H_
#define ANIMATION_2D_NEW_H_

#include <vector>
#include <string>
#include "public.h"
#include "FaceExpressionEditor.h"
//#define  __declspec(dllexport)

bool Fap2Avi2D(const char *fap_file,const char *avi_file,const char *wav_file, const   char* image_file,const char *pot_file=NULL,int codec_type=-1);
...

最佳答案

“ undefined reference ”通常意味着您的构建配置错误。例如,Android.mk 文件中的意外换行可能会导致 ma​​ke 工具为您的项目选择错误的链接命令。

通常错误消息包括缺少的函数或全局变量的名称,以及正在寻找此引用的模块(文件)。如果名称不是自解释的,您通常可以在您的源代码中找到这个名称,然后将其追溯到您使用的外部库之一,因为它很可能在 declared 中源代码中包含一些头文件(.h.hpp)。

您不太可能无意中使用了某些您必须下载的外部库,因为通常当编译器找不到必要的包含(头)文件时,此类错误通常会更早出现。

Android 原生项目显示“ undefined reference ”错误的一种特殊情况是项目使用非官方 Android API,例如OpenMax/stagefreight。在这种情况下,头文件可以在 Android 源代码树中找到,但链接阶段所需的编译库不在那里。通常的解决方法是从您的开发设备中提取二进制文件,例如

adb pull /system/lib/libstagefreight.so .

无论如何,使用 V=1 运行 ndk-build 以准确查看执行了哪些构建命令通常会有所帮助。

关于android - 如何使有关 undefined reference 的错误日志更详细,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12794315/

相关文章:

android - Gradle设置Android项目配置

c - 指向一维数组和二维数组有什么区别?

c++ - 这是一种通过实现来制作Qt信号的方法吗?

c - 如何通过外部 IP 连接套接字 (Mac)

未打印出程序的返回值时计算的字符串长度不正确

java - Android Studio 中的增强现实

java - 需要有关同步的帮助

android - fragment 在移除和动画结束后闪烁

c++ - 如何在 C++ 中填充多维数组的一部分?

c++ - 复制构造函数或赋值运算符或两者,这里调用哪个?