android error: undefined reference to 的错误分析
error: undefined reference to 的錯誤分析。
昨天,做jni,連接so庫時,android studio出現了這個問題。當時不知道是什么原因,后來,查找資料,總算解決了。這里記錄一下。
一般編譯器報 “undefined reference to”的錯誤是以下幾種情況,Android中的makefile是Android.mk命名的。
1 沒有指定對應的庫(.o/.a/.so)?
使用了庫中定義的實體,但沒有指定庫(-lXXX)或者沒有指定庫路徑(-LYYY),會導致該錯誤,?
在Android.mk中 用LDFLAGS參數來定義庫(-lXXX)和?(-LYYY)的
2 連接庫參數的順序不對?
在默認情況下,對于-l 使用庫的要求是越是基礎的庫越要寫在后面,無論是靜態還動態?
我在實際使用的過程中,發現-D參數的使用,也會導致“undefined reference to”的錯誤,推薦大家如果想在做宏控制的時候,把-D參數放到最后
3 gcc/ld 版本不匹配?
gcc/ld的版本的兼容性問題,由于gcc2 到 gcc3大版本的兼容性存在問題(其實gcc3.2到3.4也一定程度上存在這樣的問題) 當在高版本機器上使用低版本的機器就會導致這樣的錯誤, 這個問題比較常見在32位的環境上, 另外就在32位環境不小心使用了64位的庫或者反過來64位環境使用了32位的庫.?
這個問題與Linux下幾乎一樣
4 C/C++相互依賴和鏈接?
gcc和g++編譯結果的混用需要保證能夠extern "C" 兩邊都可以使用的接口,在我們的64位環境中gcc鏈接g++的庫還需要加上 -lstdc++,具體見前文對于混合編譯的說明 。
在extern “C”的使用時候,因為我經常需要用JNI鏈接純C語言的庫,我有時候加上extern "C" 還是不行,后來我才發現,extern "C" 必須要包含了頭文件,我在這個問題上糾結了很久,慚愧。
5 運行期報錯?
這個問題基本上是由于程序使用了dlopen方式載入.so, 但.so沒有把所有需要的庫都鏈接上,具體參加上文中對于靜態庫和動態庫混合使用的說明?
關于執行時動態鏈接的問題,我也碰到過很糾結的情況,就是在Android鏈接的庫依賴于我現在當前的庫,就變成了你鏈接我,我再鏈接你,導致死都編不過,最好撇清這種關系
我的問題就是依賴庫的順序不對,導致出現error: undefined reference to 。后來修改了依賴的順序,問題就解決了。這里,只需注意最基本的so庫依賴在最前面,其他不依賴其他so的庫依賴在后面。
android error: undefined reference to 的錯誤分析就講完了。
就這么簡單。
總結
以上是生活随笔為你收集整理的android error: undefined reference to 的错误分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 获取ListView内部
- 下一篇: android 获取ArrayList的