作者:金良(golden1314521@gmail.com) csdn博客:http://blog.csdn.net/u012176591 編譯動態鏈接庫時,出現了這樣的錯誤: error: undefined reference to 'xxx)' collect2: ld returned 1 exit status 屬性1. 我能肯定這與要調用動態庫的Java文件沒有任何
作者:金良(golden1314521@gmail.com) csdn博客:http://blog.csdn.net/u012176591
編譯動態鏈接庫時,出現了這樣的錯誤:
error: undefined reference to 'xxx)' collect2: ld returned 1 exit status
屬性1.
我能肯定這與要調用動態庫的Java文件沒有任何關系,因為我把Java文件刪除然后重新編譯也是這樣的錯誤。
屬性2.
我也能肯定這絕不是因為我沒有把要用到的頭文件包括進來,而且我試著將另一個函數的頭文件注釋掉,提示的錯誤是:
error: 'xxxxx' was not declared in this scope
屬性3.
當我把函數名稱更改使其前后名稱不一致時也提示錯誤:
error: 'xxxxx' was not declared in this scope
屬性4.
甚至我把直接把這個函數寫進要調用它的文件里,仍然是這樣的錯誤。
屬性5.
已確定不是Android.mk文件的問題
什么情況下會產生“error: undefined reference to 'xxx)' collect2: ld returned 1 exit status“的錯誤呢?不明白這個函數為什么這么特殊,唯獨它出現這樣的錯誤。
明明定義了這個函數,卻出現了“error: undefined reference to”的錯誤?怪哉
方案1.
在網上查到這樣一種解決方案,它是這樣描述的:
在android.mk中加入 LOCAL_ALLOW_UNDEFINED_SYMBOLS := true
也就是說,對于找不到的函數,編譯器將忽略它。
我勒個去,我寫這個函數就是要它干活的,你忽略它,雖然編譯時過關了,但是我調用這個函數時不還是找不到嗎?我還不如直接把這個函數刪掉。
方案2.
經過我仔細核對,層層排除,終于發現了問題所在。再次還原一下錯誤提示
in function render:/BitmapPlayerActivity.cpp:35: error: undefined reference to 'BrightnessFilter(unsigned short*, long, unsigned char)'
collect2: ld returned 1 exit status
make.exe: *** [obj/local/armeabi/libAVIPlayer.so] Error 1
同時貼出出現錯誤的函數所在的文件BitmapPlayerActivity.cpp:
#ifdef __ARM_NEON__ void BrightnessFilter( unsigned short* pixels, long count, unsigned char brightness) { //具體內容忽略 } static void neonBrightnessFilter( unsigned short* pixels, long count, unsigned char brightness) { //具體內容忽略 } #endif
PS1.
需要注意的是,在同一個cpp文件里如果函數之間存在調用關系,一定要把被調用的函數寫在要調用它的函數的前面,例如下面的文件編譯時會提示如下錯誤:
jni/BrightnessFilter.cpp: In function 'void BrightnessFilter(short unsigned int*, long int, unsigned char)':
jni/BrightnessFilter.cpp:7:52: error: 'genericBrightnessFilter'was not declared in this scope
make.exe: *** [obj/local/armeabi/objs/AVIPlayer/BrightnessFilter.o] Error 1
BrightnessFilter.cpp:
#include "BrightnessFilter.h" void BrightnessFilter(unsigned short* pixels, long count, unsigned char brightness) { genericBrightnessFilter(pixels, count, brightness);//調用了genericBrightnessFilter(),但函數genericBrightnessFilter()在BrightnessFilter()函數之前并沒有實現體,所以出錯 } static void genericBrightnessFilter( unsigned short* pixels, long count, unsigned char brightness) { //函數體沒有引用其他函數,具體內容略 }
jni/Android.mk:11: *** commands commence before first target. Stop.
這是因為Android.mk中LOCAL_SRC_FILES 加載文件時斜杠后有空格,刪除即可。在另一處也可能出現類似錯誤,請參看Android編譯ffmpeg遇到的問題、解決方法、相關文件和編譯全過程
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com