2012-02-06 60 views
1

我試圖移植一個C++實用程序,我想從Android的ADB外殼程序運行。 爲此,我使用Android NDK的make-standalone-toolchain.sh腳本,並使用它編譯我的程序。 不幸的是,當我嘗試運行它,我得到這個錯誤:在Android的adb外殼程序本地程序中使用stl

reloc_library[1315]: 16304 cannot locate '_ZNKSs5c_strEv'... 
CANNOT LINK EXECUTABLE 

經過一番研究,我看到這意味着c_str函數不存在的libstdC++所以在NDK。我也無法在stlport.so中找到符號,實際上只能在./sources/cxx-stl/gnu-libstdc++/libs/版本的C++庫中找到它。這些庫不包含在我製作的獨立工具鏈中,而且我也無法在設備上找到它們(設備正在運行Honeycomb)。

NDK中的文本明確指出,當我使用stlport時,支持整個STL。這是冰淇淋三明治中唯一真實的東西嗎? libstlport.so或libsupC++。如此在設備和NDK上沒有任何簽名,如沒有找到的簽名。

所以我的問題有兩個部分:

  1. 有我丟失的東西在構建過程中/ Android的設置?我可以設置不同的東西,以便程序可以在不需要gnu-libstC++的情況下進行編譯,或者至少在編譯/鏈接錯誤時失敗,而不是無法在設備上加載?
  2. 如果與gnu-libstC++鏈接是唯一的方法,我該怎麼做?我認爲我可以管理靜態鏈接,但我寧願不。

我怎樣才能經GNU的libstdC++版本添加到我的

+0

要選擇不同的STL實現(如靜態stlport或靜態gnustl),請在Application.mk文件(閱讀文檔/ CPLUSPLUS-SUPPORT.html文件)中使用APP_STL變量。 – 2012-02-06 18:17:54

+0

不幸的是,我不能這樣做,因爲我使用了獨立的工具鏈,並且通常我不編譯活動,而是計劃在adb外殼上運行的Linux程序(類似於ps或cp) – nitzanms 2012-02-07 12:56:31

+0

然後檢查ndk-build如何選擇STL實現(它選擇特定的CFLAGS和LDFLAGS)。爲獨立工具鏈選擇相同的編譯器和鏈接器標誌,您將能夠選擇靜態STL庫。 – 2012-02-07 19:06:00

回答

0

如果別人尋找一個解決方案,我最終加入使用上libgnustl_shared.so -l開關的依賴。您可以在

sources/cxx-stl/gnu-libstdc++/libs/&ltarchitecture>/

發現它裏面NDK我再與程序推這個。所以在一起的設備,並做了一個腳本,將當前目錄到LD_LIBRARY_PATH。這似乎與使用make腳本創建依賴於gnustl的程序時NDK所做的相似。