這是今天在改transform時遇到的問題
研究網路上關於 multiple definition of XXX first defined here 的錯誤
發現可能是因為兩個.o檔各自都定義了function
所以導致系統不知到要用哪一個,所以才會遇到這個問題
雖然我很困惑,在這邊我是將function寫在.h檔裡面
而照理說像是include 他的Decode_P或是Decode_I應該都只是include才對
應該是不會同時造兩個function才對
不過後來解決方式我還是將我改的function改到.h檔下面的.c檔裡面才問題就解決了
困惑的問題 (紀錄一下)
SharedLibrary : libopensvcui.so
/home/Administrator/android-ndk-r4-crystax/samples/OpenSVC/opensvcui/obj/local/armeabi-v7a/libbaseline.a(decode_MB_P.o): In function `ict_4x4_residual_neon':
/home/Administrator/android-ndk-r4-crystax/samples/OpenSVC/baseline/jni/src/Tran
sform.h:195: multiple definition of `ict_4x4_residual_neon'
/home/Administrator/android-ndk-r4-crystax/samples/OpenSVC/opensvcui/obj/local/armeabi-v7a/libbaseline.a(decode_MB_I.o):/home/Administrator/android-ndk-r4-crystax/samples/OpenSVC/baseline/jni/src/Transform.h:195: first defined here
/home/Administrator/android-ndk-r4-crystax/samples/OpenSVC/opensvcui/obj/local/armeabi-v7a/libbaseline.a(Transform.o): In function `ict_4x4_residual_neon':
/home/Administrator/android-ndk-r4-crystax/samples/OpenSVC/baseline/jni/src/Tran
sform.h:195: multiple definition of `ict_4x4_residual_neon'
/home/Administrator/android-ndk-r4-crystax/samples/OpenSVC/opensvcui/obj/local/armeabi-v7a/libbaseline.a(decode_MB_I.o):/home/Administrator/android-ndk-r4-crystax/samples/OpenSVC/baseline/jni/src/Transform.h:195: first defined here
collect2: ld returned 1 exit status
make: *** [/home/Administrator/android-ndk-r4-crystax/samples/OpenSVC/opensvcui/
obj/local/armeabi-v7a/libopensvcui.so] Error 1
make: Leaving directory `/home/Administrator/android-ndk-r4-crystax/samples/Open
SVC/opensvcui'
-----------------------------------5/1---------------------------------------------
transform卡死在一個很詭異的地方
block讀進來後,與值image相加後再存回image
結果發現image的值有時候進來是錯的0.0
但是一但我把neon的transform function關掉
圖又會是對的
所以很明顯的表示我的function有改到image的值
但是照理說我只是把block加到image上
所以我在debug時猜測說,其實我處理完的image值有時候會被重複使用
所以才會有讀入就錯的情形
那麼~~~~照這樣推下來就是我block運算後的值是錯的囉 ?
我很努力的算了一下每個步驟的值
發現都對阿
結果呢
花了一番工夫把c的值和neon的值print出來比對
發現我neon的值沒錯,竟然是c的錯
而且是在一個shift right 6 的地方
ex. (-672 >>6)
照理說應該是-10,結果c算出來是-11
真他媽的詭異
先不管反向(負值)
672 = 1010100000
而shift right 6後,值是 1010(也就是10)
所以根本沒有round的問題
所以結果我決定以我neon的圖為正解