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

相關問題