首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >android无法包含iostream的原因是什么?

android无法包含iostream的原因是什么?
EN

Stack Overflow用户
提问于 2012-03-15 22:30:09
回答 3查看 10.4K关注 0票数 8

我已经安装了android-ndk-r7,正在尝试编译.cpp文件。

代码语言:javascript
复制
#include <iostream>

using namespace std;

int main ( int argc, char ** argv)
{

     cout <<"Hello World.."<<endl;

} 

执行以下命令:进入jni文件夹,并执行

代码语言:javascript
复制
#ndk-build

出现以下错误:

代码语言:javascript
复制
/home/jelari/Desktop/androidDevelopment/android-ndk-r7/DCF/jni/test1.cpp:1:20: error: iostream: No such file or directory
/home/jelari/Desktop/androidDevelopment/android-ndk-r7/DCF/jni/test1.cpp: In function 'int main(int, char**)':
/home/jelari/Desktop/androidDevelopment/android-ndk-r7/DCF/jni/test1.cpp:8: error: 'cout' was not declared in this scope
/home/jelari/Desktop/androidDevelopment/android-ndk-r7/DCF/jni/test1.cpp:8: error: 'endl' was not declared in this scope
make: *** [/home/jelari/Desktop/androidDevelopment/android-ndk-r7/DCF/obj/local/armeabi/objs/test1/test1.o] Error 1

我做错了什么?

我的Android.mk文件如下所示:

代码语言:javascript
复制
# A simple test for the minimal standard C++ library
#

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := test1
LOCAL_SRC_FILES := test1.cpp
include $(BUILD_EXECUTABLE)

Application.mk文件看起来像这样:

代码语言:javascript
复制
# Build both ARMv5TE and ARMv7-A machine code.
APP_ABI := armeabi armeabi-v7a

请指出错误之处?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-15 22:48:04

所以答案在这里很容易找到所以,这就是:

默认情况下,C++标准库非常小。

您需要在Application.mk文件中设置APP_STL。

我使用:

APP_STL := gnustl_static

但是您可以使用system、stlport_static、stlport_shared或gnustl_static。

它记录在$NDK/docs/CPLUSPLUS-SUPPORT.html下,并且有点隐藏,因为$NDK/documentation.html索引文件没有列出它。

引用自http://groups.google.com/group/android-ndk/browse_thread/thread/983c436239d48704?pli=1

票数 11
EN

Stack Overflow用户

发布于 2016-06-03 23:22:24

另一种方法是,如果没有application.mk和android.mk文件,

将此添加到您的build.gradle中

代码语言:javascript
复制
ndk{
    moduleName = your_module_name
    stl = "c++_static"
}
票数 3
EN

Stack Overflow用户

发布于 2019-07-16 17:01:11

我遇到了这个问题,我花了几天的时间将我的NDK从r10e更新到r20,有几个变量发生了变化。

用于NDK r10e的

Android.mk:

代码语言:javascript
复制
include $(CLEAR_VARS)
LOCAL_MODULE := main
LOCAL_SRC_FILES := ./main.cpp   
LOCAL_C_INCLUDES += $(LOCAL_PATH)/
LOCAL_CPP_EXTENSION := .cxx .cpp .cc
LOCAL_CPPFLAGS := -fexceptions -frtti
LOCAL_CPPFLAGS += -std=c++11 -D__cplusplus=201103L
include $(BUILD_EXECUTABLE)

Application.mk:

代码语言:javascript
复制
APP_ABI := all
APP_STL := gnustl_static
NDK_TOOLCHAIN_VERSION := 4.9
APP_OPTIM := debug

用于NDK r20

Android.mk:

代码语言:javascript
复制
include $(CLEAR_VARS)
LOCAL_MODULE := main
LOCAL_SRC_FILES := ./main.cpp   
LOCAL_C_INCLUDES += $(LOCAL_PATH)/
LOCAL_CPP_EXTENSION := .cxx .cpp .cc
LOCAL_CPPFLAGS := -fexceptions -frtti
LOCAL_CPPFLAGS += -std=c++11 -D__cplusplus=201103L -DANDROID_STL=c++_shared
include $(BUILD_EXECUTABLE)

Application.mk:

代码语言:javascript
复制
APP_ABI := all
#In general, you can only use a static variant of the C++ runtime if you have one and only one shared library in your application.
APP_STL := c++_static
NDK_TOOLCHAIN_VERSION := clang
APP_PLATFORM := android-23
APP_OPTIM := debug

和我的main.cpp (包括我的bin_node.h):

代码语言:javascript
复制
int main(int argc,char **argv) {   
printf("****************** tree node ******************\n");
amo::BinNode<int> root(0);
amo::BinNode<int>* lchild1 = root.insertLeftChild(1);
amo::BinNode<int>* rchild2 = root.insertRightChild(2);
amo::BinNode<int>* lchild3 = lchild1->insertLeftChild(3);
amo::BinNode<int>* rchild4 = lchild1->insertRightChild(4);
amo::BinNode<int>* lchild5 = rchild2->insertLeftChild(5);
amo::BinNode<int>* rchild6 = rchild2->insertRightChild(6);
amo::BinNode<int>* lchild7 = lchild3->insertLeftChild(7);
amo::BinNode<int>* rchild8 = lchild3->insertRightChild(8);
amo::BinNode<int>* lchild9 = rchild6->insertLeftChild(9);
amo::BinNode<int>* rchild10 = rchild6->insertRightChild(10);
amo::BinNode<int>* lchild11 = rchild8->insertLeftChild(11);
amo::BinNode<int>* rchild12 = rchild8->insertRightChild(12);

printf("going to root.traversePre()\n");
root.traversePre();
printf("going to root.traversePreLoop()\n");
root.traversePreLoop();
printf("going to root.traversePreLoop2()\n");
root.traversePreLoop2();
printf("\n****************** main return ******************\n");
return 0;}

运行ndk-构建并构建可执行文件

有关这方面的更多源代码和信息,请查看my GitHub

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9721856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档