1

我有一个“未定义的引用___”错误使用Android NDK。有很多像我这样的SO问题,但没有人帮助过我。我的主要问题可能是理解错在哪里,或者可能是我对Android.mk makefile命令的无知。无法解决“未定义的引用”错误构建Android NDK库

这是运行ndk-build时的第一个输出。注意libProcessor.so,函数调用图片:: findTransform()Image.cpp,当然还有未定义提及 '矩阵::矩阵(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对象的声明,但是我成功编译Image时不知道我在哪里为Matrix构造函数添加了代码。 CPP。“?

+0

是'Matrix'在头文件中完全定义?它看起来像你有'Matrix.cpp',你忘了添加到构建。 – 2014-10-02 20:28:37

+0

那么我修改LOCAL_SRC_FILES为: LOCAL_SRC_FILES:= Processor.cpp Image.cpp newmat10/Matrix.cpp 我现在得到: “make:***没有规则使目标'jni/newmat10/Matrix.cpp' ,'obj/local/armeabi-v7a/objs/Processor/newmat10/Matrix.o'需要。停止。“这是一个进步吗? – Alyoshak 2014-10-02 21:20:45

+0

这不是一个前进的步骤。我刚才发现Matrix类的定义分散在几个文件中,比如newmat1.cpp,newmat2.cpp等。实际上没有Matrix.cpp文件,所以我现在必须弄清楚如何让makefile找到这些文件。即使我还没有解决方案,你一定会帮助我理解问题。 – Alyoshak 2014-10-02 21:27:54

回答

1

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

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

Anton,似乎可以让事情在Matrix类问题中发展。它走了一段路,然后给了我另一个错误,但它看起来非常不同,所以我将你的答案列为正确答案,我可能不得不稍后再发布。 – Alyoshak 2014-10-02 21:59:21

相关问题