无法解决构建Android NDK库时出现的“未定义引用”错误

时间:2014-10-02 20:20:29

标签: c++ android-ndk linker-errors undefined-reference android.mk

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

这是我运行ndk-build时的第一个输出。注意 libProcessor.so ,函数调用 Image.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类的源代码文件正在构建到libProcessor.so以及调用它的Image.cpp代码中,那么解析引用还需要知道什么呢?也许问题出在我的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对象的声明,但是我不知道在哪里放置了Matrix构造函数的代码。我成功编译了Image.cpp。"?

1 个答案:

答案 0 :(得分:1)

因此,您不必拥有构建中包含的Matrix的源文件。如果您有多个文件,而不是手动列出它们,则可以像这样修改Android.mk

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