无法解决构建安卓 NDK 库时出错"undefined reference to"

Cannot solve "undefined reference to" error building an Android NDK library

本文关键字:出错 undefined to reference NDK 解决 构建      更新时间:2023-10-16

我在使用Android NDK时出现"未定义对___的引用"错误。像我这样的SO问题有很多,但没有一个对我有帮助。我的主要问题可能是理解哪里出了问题,也可能是我对Android.mk makefile命令一无所知。

这是我运行ndk构建时的第一个输出。请注意libProcessor.soImage.cpp中对Image::findTransform()的函数调用,当然还有对'Matrix::Matrix(int,int)'的未定义引用:

Android NDK: WARNING: APP_PLATFORM android-19 is larger than android:minSdkVersion 15 in ./AndroidManifest.xml    
[armeabi-v7a] SharedLibrary  : libProcessor.so
/Applications/adt-bundle-mac-x86_64-20140702/ndk/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi-v7a/objs/Processor/Image.o: in function Image::findTransform(float, float, CGPoint, CGPoint, CGPoint, CGPoint, float&, float&, float&, float&, float&, float&, float&, float&):jni/Image.cpp:1230: error: undefined reference to 'Matrix::Matrix(int, int)'

它抱怨的代码行很简单:

    Matrix A(8,8);

源代码文件中的Matrix类,而不是预构建的库。起初,我对Matrix类有编译错误,但在包含newmat10.h文件后,这些错误都消失了,所以我知道正在找到newmat10目录及其所有源代码。这就是让我困惑的地方:定义Matrix类的源代码文件正与调用它的Image.cpp代码一起构建到libProcessor.So中,那么它还需要知道什么才能解析引用呢?也许问题出在我的Android.mk文件中,它在这里:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := Processor
LOCAL_SRC_FILES := Processor.cpp Image.cpp
LOCAL_LDLIBS    := -llog
LOCAL_C_INCLUDES := 
  $(LOCAL_PATH)/newmat10 

include $(BUILD_SHARED_LIBRARY)

当然,我特别需要修复这个错误,但我也非常想了解它的具体性质。系统不是说,"我现在正在尝试编写Image.o对象文件,我看到了Matrix对象的声明,但当我成功编译Image.cpp时,我不知道我把Matrix构造函数的代码放在哪里了。"?

因此,构建中没有包含Matrix的源文件。如果你有几个文件,你可以这样修改你的Android.mk,而不是手动列出它们:

LOCAL_SRC_FILES := Processor.cpp Image.cpp
LOCAL_SRC_FILES += $(foreach file, $(wildcard jni/newmat10/*.cpp), ../${file})