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所做的相似。

相关问题