c++11 - 无法使用适用于Android的CMake GUI启用C++ 11的情况下编译ChaiScript

标签 c++11 compiler-errors android-ndk cmake chaiscript

我无法为Android构建ChaiScript库。
最初,我尝试使用CMake GUI为linuxMint构建ChaiScript,如下所述

Source Path + binary Path -> Configure -> Specify Generator -> Generate -> Make.       

一切正常。所以我尝试按照以下提到的步骤为Android构建它

Source Path + binary Path -> Configure -> Specify Generator
1. Select specify tool-chain for cross compiling
2. (android.toolchain.cmake)
3. Path environment variable modified to have android-ndk path(added to .profile)
-> Generate -> Make.



现在它给出错误为“错误:'to_string'不是'std'的成员”和“错误:'stoll'不是'std'的成员”

最初,我使用POC在eclipse + Android + NDK中使用此std::to_string和std::stoll并将其设置为"compile, build & run"。但是在CMake GUI中,我不知道如何输入以下标志
  • APP_STL:= c++ _ static
  • TARGET_PLATFORM:= android-21
  • TARGET_ARCH_ABI:= armeabi-v7a

  • 我尝试通过“添加条目”和“字符串”作为类型。但是没有运气。错误仍然存​​在。任何解决方案/建议表示赞赏。

    最佳答案

    我本人为此问题发布了该解决方案。 (当我使用eclipse + jni而不是CMake GUI编译代码时,它不能很好地解决所提出的问题。但这可能会对某人有所帮助。)

    该源代码已成功编译,使用Eclipse IDE + Android Project + JNI方法(Android NDK + Android.mk + Application.mk)构建。通过引用一些stackoverflow QA,下面给出了Android.mk和Application.mk脚本。在脚本内部的注释中,给出了使用标志的原因。这些注释对于理解脚本很有用。

    Android.mk


    LOCAL_PATH := $(call my-dir)
    #Build Script to build ChaiScript library
    include $(CLEAR_VARS)
    #Used the below flag for (error: undefined reference to '__atomic_fetch_add_4')
    LOCAL_LDLIBS += -latomic
    # Here we give our module name and source file(s)
    LOCAL_MODULE    := chaiscript
    #ChaiScript header files
    LOCAL_C_INCLUDES := $(LOCAL_PATH)/include_CS
    #ChaiScript source files
    LOCAL_SRC_FILES := src_CS/chaiscript_stdlib.cpp src_CS/main.cpp src_CS/stl_extra.cpp src_CS/test_module.cpp
    #CPP files in the extension
    LOCAL_CPP_EXTENSION := .cxx .cpp .cc .hpp
    include $(BUILD_SHARED_LIBRARY)
    
    #Build Script to build library caller code    
    #LOCAL_PATH := $(call my-dir) #won't get cleared by clear_vars
    include $(CLEAR_VARS) #clearing the variables defined for chaiscript build
    LOCAL_MODULE := test_chaiscript
    LOCAL_SRC_FILES := libchaiscript.so #can be 'chaiscript' alone
    #ChaiScript Library headerfiles
    LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include_CS
    #Caller code header files
    LOCAL_C_INCLUDES := $(LOCAL_PATH)/header_own
    #Caller code source files
    LOCAL_SRC_FILES := src_own/NativeFunction.cpp src_own/clsArithmeticParser.cpp
    include $(BUILD_SHARED_LIBRARY)
    

    Application.mk


    #APP_STL := stlport_static
    #Build the library by enabling C++11  
    APP_STL:=c++_static
    APP_LDLIBS    += -llog
    #Used the below flag for 
    #(Error: '...' handler must be the last handler for its try block [-fpermissive]
    #           } catch (const std::out_of_range &) {)
    APP_CPPFLAGS += -fexceptions
    #Used the below flag for (Error: 'dynamic_cast' not permitted with -fno-rtti)
    APP_CPPFLAGS += -frtti
    #Architecture to support armeabi-v7a & x86
    APP_ABI := armeabi-v7a x86
    #Android platform
    APP_PLATFORM := android-21
    

    由于我的android ndk版本不支持 thread_local存储类,因此我需要将宏“CHAISCRIPT_HAS_THREAD_LOCAL”取消定义为文件chaiscript_threading.hpp
    #undef CHAISCRIPT_HAS_THREAD_LOCAL (you can understand if you refer the source code)
    

    ndk-build output :


    ndk-build 
    Android NDK: WARNING: APP_PLATFORM android-21 is larger than android:minSdkVersion 9 in ./AndroidManifest.xml    
    [armeabi-v7a] Compile++ thumb: chaiscript <= chaiscript_stdlib.cpp
    [armeabi-v7a] Compile++ thumb: chaiscript <= main.cpp
    [armeabi-v7a] Compile++ thumb: chaiscript <= stl_extra.cpp
    [armeabi-v7a] Compile++ thumb: chaiscript <= test_module.cpp
    [armeabi-v7a] SharedLibrary  : libchaiscript.so
    [armeabi-v7a] Install        : libchaiscript.so => libs/armeabi-v7a/libchaiscript.so
    <i ignored the output of [x86] Compile++>
    

    Code Usage :


    #include "header_own/NativeFunction.h"
    #include "include_CS/chaiscript/chaiscript.hpp"
    #include "include_CS/chaiscript/chaiscript_stdlib.hpp"
    
    std::string str;
    
    std::string helloWorld(const std::string &t_name) {
        str = "Hello " + t_name + "!";
        return "Hello " + t_name + "!";
    }
    
    JNIEXPORT jstring JNICALL Java_com_example_androidxmldesign_1exercise01_clsNativeFunctionWrapper_invokeNativeFunction(
            JNIEnv *env, jobject obj) {
        chaiscript::ChaiScript chai(chaiscript::Std_Lib::library());
        chai.add(chaiscript::fun(&helloWorld), "helloWorld");
        chai.eval(R"(puts(helloWorld("Bob"));)");
        //below string return value will be appended to a textview
        //existing vlaue
        return env->NewStringUTF(str.c_str());
    }
    

    Screen Shot : enter image description here

    关于c++11 - 无法使用适用于Android的CMake GUI启用C++ 11的情况下编译ChaiScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36174866/

    相关文章:

    c++ - 编译 boost C++11 clang mac 找不到 cstddef

    c++ - 我可以在不指定数字分布的情况下使用随机生成器吗?

    c# - 提供程序选项中的“compilerVersion”属性必须为 'v4.0' 或更高版本

    android - 无法解析函数 'glDrawTexfOES'

    c++ - 我可以返回一个 vector 以使用 C++11 扩展现有 vector 吗?

    c++11 - 无法运行 move 构造函数

    java - 错误找不到符号

    c++ - 尝试从本地类方法访问属性时出现编译错误

    android - 如何构建 Android NDK 示例 : "bitmap-plasma"

    android - ndk r20 ld : ld: error: cannot find -lpthread