编译android版本llvm编译器

2023-10-26

编译android版本llvm编译器

准备

编译环境:ubuntu 20.04.2
编译器版本:ndk-24.0.8215888
llvm版本: 15.0.7

最近需要在android上编译C++项目,需要在android上使用arm版本的编译工具

1. 下载需要版本的llvm,切换到指定版本 本人编译的15.0.7

git clone --recursive https://github.com/llvm/llvm-project

2. 修改CMake脚本屏蔽Pass相关链接错误

    cd llvm-project/llvm/lib/Transforms
  • 修改CMakeLists.txt 如下:
    add_llvm_library( LLVMHello MODULE BUILDTREE_ONLY
  Hello.cpp

  DEPENDS
  intrinsics_gen
  PLUGIN_TOOL
  opt
  )
  
  ==>> 改为:
  if(NOT ANDROID)
        add_llvm_library( LLVMHello MODULE BUILDTREE_ONLY
          Hello.cpp

          DEPENDS
          intrinsics_gen
          PLUGIN_TOOL
          opt
          )
    endif()
    cd llvm-project/llvm/tools/bugpoint-passes
  • 修改CMakeLists.txt 文件如下:
    add_llvm_library( BugpointPasses MODULE BUILDTREE_ONLY
  TestPasses.cpp

  DEPENDS
  intrinsics_gen
  bugpoint
  )
  
  ==>> 改为:
  if(NOT ANDROID)
        add_llvm_library( BugpointPasses MODULE BUILDTREE_ONLY
          TestPasses.cpp

          DEPENDS
          intrinsics_gen
          bugpoint
          )
  endif()
    cd llvm/examples/Bye
  • 修改CMakeLists.txt 文件如下:
      add_llvm_pass_plugin(Bye
    Bye.cpp
    DEPENDS
    intrinsics_gen
    BUILDTREE_ONLY
   )

  install(TARGETS ${name} RUNTIME DESTINATION "${LLVM_EXAMPLES_INSTALL_DIR}")
  set_target_properties(${name} PROPERTIES FOLDER "Examples")
  
  ==>>改为:
  if (NOT WIN32 AND NOT ANDROID)
          add_llvm_pass_plugin(Bye
            Bye.cpp
            DEPENDS
            intrinsics_gen
            BUILDTREE_ONLY
           )

          install(TARGETS ${name} RUNTIME DESTINATION "${LLVM_EXAMPLES_INSTALL_DIR}")
          set_target_properties(${name} PROPERTIES FOLDER "Examples")
        endif()

3. 下载android ndk 配置到环境变量

    export ANDROID_NDK=/home/feiker/Android/Sdk/ndk/24.0.8215888/

4. 编辑shell文件 build_android.sh

    build_llvm=`pwd`/build-llvm
    build_clang=`pwd`/build-clang
    installprefix=`pwd`/install
    LLVM_DIR=`pwd`/llvm-project

    mkdir -p $build_llvm
    mkdir -p $installprefix

    cmake -G Ninja -S $LLVM_DIR/llvm -B $build_llvm \
          -DLLVM_INSTALL_UTILS=ON -DLLVM_ENABLE_PROJECTS="clang;libcxx;libcxxabi" \
          -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \
          -DANDROID_ABI="arm64-v8a" -DANDROID_PLATFORM=android-24 \
          -DCMAKE_INSTALL_PREFIX=$installprefix \
          -DLLVM_INCLUDE_TESTS=OFF \
          -DLLVM_BUILD_TESTS=OFF \
          -DLLVM_INCLUDE_BENCHMARKS=OFF \
          -DCMAKE_BUILD_TYPE=Release

    ninja -C $build_llvm install -j19

5. 执行编译脚本

    sh build_android.sh

6. 拷贝到android并运行

  //连接设备
  adb connect 192.19.0.89
  //拷贝到设备上
     adb push ./install /data/local/tmp
     
     //编译cpp文件,报错提示一些头文件不存在
     ./bin/clang++ main.cc -I include/c++/v1
     
     //拷贝sysroot目录下的usr文件夹到install目录
     adb push sysroot/usr /data/local/tmp/install/
     
     //执行
     ./bin/clang++ main.cc -I include/c++/v1 -I usr/include -I usr/local/include -I usr/include/aarch64-linux-android
     
     //提示ld工具找不到
     需要arm64版本的binutils工具,参考另一篇博客编译android版本binutils
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编译android版本llvm编译器 的相关文章

  • 是否可以使用最新的 APP_PLATFORM,同时仍保持向后兼容性?

    这是我的 Application mk APP ABI armeabi v7a APP PLATFORM android 16 APP OPTIM release APP STL gnustl static APP CPPFLAGS std
  • Android中如何使用洪水填充算法?

    我是Android编程新手 最近尝试编写一个简单的应用程序 仅供练习 在这个中 我想在用户点击时为图像着色 但我不知道如何开始 我读过不同的主题 其中提到使用 洪水填充 算法 我在网上找到了它 但我不知道如何将它放入我的简单应用程序中 我找
  • 使用 Google Places Autocomplete API 的 REQUEST_DENIED 响应

    我正在开发 Android 应用程序 它使用谷歌的地点自动完成 API 当尝试点击以下网址时 我得到的答复如下 预测 状态 REQUEST DENIED 我从下面的链接获得了 API 密钥Google API 控制台 http code g
  • 使用 APDU 命令的有效 NFC 读取比特率是多少?

    我目前正在使用 Android IsoDep trancieve 函数发送和接收累计 1628 字节的数据 该函数分布在 35 个 APDU 命令 选择应用程序 身份验证 读取 中 字节计数包括返回的 MAC 校验和以及由 transcie
  • 连接到不可发现的蓝牙设备

    我正在开发一个安卓应用程序 只是一个一般性问题 是否可以连接到公开不可发现的设备 提前致谢 如果您之前已与该设备配对 则即使该设备未处于可发现模式 也可以再次连接到该设备 参见这篇文章 以编程方式连接到配对的蓝牙设备 https stack
  • 访问角落里的存储

    我能找到的与文件存储有关的最接近文档的是这个帖子 http nookdeveloper zendesk com entries 20257971 updated what are the size constraints on my app
  • Android - 当不在栏顶部时推送通知空白

    我在使用 Android 推送通知时遇到一个小问题 如果有 3 个通知 并且只有其中一个显示标题和消息 位于酒吧顶部的那个 如果有人知道可能是什么问题 请告诉我 请参阅此链接上的图像 这就是我接收通知的方式http postimg org
  • 如何在 Firebase 远程配置中从 JSON 获取值

    我是 Android 应用开发和 Firebase 的新手 我想知道如何获取存储在 Firebase 远程配置中的 JSONArray 文件中的值 String 和 Int 我使用 Firebase Remote Config 的最终目标是
  • Android模拟器分配内存失败8

    当我尝试从 Eclipse 运行 WXGA800 模拟器时 出现如下错误 Failed to allocate memory 8 This application has requested the Runtime to terminate
  • 如何在android中的操作栏中创建Edittext?

    我们可以在操作栏中使用编辑文本吗 在阅读了 Google 中的大量资源后 我找不到如何在操作栏中创建编辑文本 谁能告诉我该怎么做 您可以设置自定义View为了ActionBar像这样 getActionBar setCustomView R
  • 在 AppAuth-Android 中注销

    我有一个用JAVA开发的Android应用程序 对于这个应用程序 我使用的是身份服务器4 https github com IdentityServer IdentityServer4作为我的 STS 一切正常 但我找不到任何注销的实现Ap
  • android 中camera.setParameters 失败

    我已将相机功能包含在我的应用程序中 我还在市场上推出了该应用程序 我从一位用户那里收到一条错误消息 称他在打开相机时遇到错误 我已经在 2 1 的设备上测试了该应用程序 我从用户那里得到的错误是使用 Nexus One 它主要运行 2 2
  • 在 Android 中上传文件出现内存不足错误

    我的上传代码如下 String end r n String twoHyphens String boundary try URL url new URL ActionUrl HttpURLConnection con HttpURLCon
  • Android - iphone 风格 tabhost [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • “无法实例化活动”错误

    我的一个 Android 应用程序拥有大约 100 000 个用户 每周大约 10 次 我会通过 Google 的市场工具向我报告以下异常情况 java lang RuntimeException Unable to instantiate
  • 更改Android菜单的背景颜色[重复]

    这个问题在这里已经有答案了 我正在尝试将标准浅灰色更改为浅绿色 似乎没有一个简单的方法可以做到这一点 例如 通过 Android 主题 但我找到了一个解决方法 如本页所述 http tinyurl com 342dgn3 http tiny
  • android:layout_alignParentBottom 在没有显式布局高度作为 ListView 中的行的情况下使用时会被忽略

    当我使用RelativeLayout与任一fill parent or wrap content作为高度和一个指定的元素 android layout alignParentBottom true 它被忽略并在顶部对齐 设置高度Relati
  • 如何在Android中解析xml类型的HTTPResponse

    我有一个 Android 应用程序 我使用 POST 方法来获取响应 这是我的代码 HttpResponse httpResponse httpclient execute httppost HttpEntity resEntity htt
  • Android:无法发送http post

    我一直在绞尽脑汁试图弄清楚如何在 Android 中发送 post 方法 这就是我的代码的样子 public class HomeActivity extends Activity implements OnClickListener pr
  • 在状态栏下方显示DialogFragment内容

    我试图显示高度和宽度均具有 match parent 的 DialogFragment 但碰巧在顶部 DialogFragment 显示在 StatusBar 下方 DialogFragment 正在应用一些默认值来填充底部 右侧 左侧和顶

随机推荐

  • Linux常用技巧

    1 cd命令 用于切换当前目录 它的参数是要切换到的目录的路径 可以是绝对路径 也可以是相对路径 cd user1 进入user1用户的主目录 cd 返回上次所在的目录 2 pwd命令 显示工作路径 3 ls命令 查看文件与目录的命令 li
  • ChatGLM搭建记录

    ChatGLM 一 基本流程 0 学习初衷 1 ChatGLM简介 github地址 https github com THUDM ChatGLM 6B ChatGLM 6B 是一个开源的 支持中英双语的对话语言模型 基于 General
  • Java 多线程练习7:模拟网络购票

    需求 1 package GouPiao 2 3 4 模拟网络延时线程不安全 5 6 public class Site implements Runnable 7 private int count 10 记录剩余票数 8 private
  • 使用动软.net代码生成器生成数据库文档

    首先 进入动软 net代码生成器主界面 选择服务器 右击 选择 连接服务器 按照弹出的界面 操作 就可以将需要生成数据库文档的相关服务器添加进来 然后 选中服务器 选择工具栏中的 生成数据库文档 按钮 在弹出的 生成数据库文档 窗口中 依次
  • Blender一步一步用灰度图生成3D模型用于Gazebo/gzweb

    我们经常能在SDF格式文件中见到 dae stl模型文件 比如如下代码
  • 地址总线与数据总线

    CPU通过地址总线寻址 然后通过数据总线与外部设备互换信息 地址总线 地址总线的位数决定CPU寻址范围 若CPU的地址总线宽度是32位 那么CPU的寻址范围是4G 所以最多支持4G内存 数据总线 数据总线的位数决定CPU单次通信能交换的信息
  • C++编程题

    1 计算字符串最后一个单词的长度 单词以空格隔开 字符串长度小于5000 注 字符串末尾不以空格为结尾 贴代码 include
  • 虚拟机扩容

    文章目录 虚拟机扩容 扩容背景 软件版本 操作步骤 1 VM上修改磁盘信息 2 在系统中挂载磁盘 1 使用命令查看磁盘状态 2 通过命令查看到新磁盘的分区 3 然后对新加的磁盘进行分区操作 4 重启虚拟机 5 再次用以下命令查看到磁盘当前情
  • 专访XRuby贡献者郑晔:软件开发不是自娱自乐(上)

    郑晔 是一个热爱编程的程序员 网络ID dreamhead 也许有人会说 我还是一个超热爱编程的程序员呢 那么我想你一定不知道 郑晔是第一个加入到XRuby这个开源项目的 XRuby今天优异的成绩与郑晔有着不可分割的联系 在郑晔的blog中
  • tablesorter ajax,jquery tablesorter ajax表只排序一个方向

    我遇到了同样的问题 但设置不同 这个帖子中提到的答案没有解决我的问题 为我的方案添加解决方案 以防其他人遇到同样的问题 我的表体行是在页面加载时从 ajax调用动态创建的 并且一列被设置为默认sortList 以在加载数据后进行排序 根据提
  • 1~100带圈的数字_输入带圈字符的几种方法,你会几种?

    我们在编辑Word的时候 会需要输入带圈序号 今天零壹学长就给大家介绍几种输入带圈字符的方法 一起来看看吧 利用带圈字符 先输入数字 再选中数字 然后点击 开始 点击 字体 组中的 带圈字符 就可以了 利用符号功能 使用符号功能只能应用1
  • Cobalt Strike渗透神器详解

    Cobalt Strike 前言 简介 功能使用 下载与安装 基础使用 CS如何成功上线 所需环境 添加监听 生成后门木马 钓鱼链接 成功拿到shell CS如何联动MSF 所需环境 前提条件 MSF配置监听模块 CS新建监听器 成功交互
  • uniapp项目中使用第三方的包@escook/request-miniprogram来创建网络请求

    1 安装 npm install escook request miniprogram 2 在main js中导入 import App from App import Vue from vue 导入网络请求的包 import http f
  • 计算机原理--浮点数的加减法运算

    浮点数的加减法 对阶 尾数求和 尾数规格化 溢出判断 乘除 对阶 对阶的目的是使得两个浮点数阶码一致 使得尾数可以进行运算 浮点数尾数运算简单 浮点数位数实际小数位与阶码有关 阶码按小阶看齐大阶的原则 尾数求和 使用补码进行运算 减法运算转
  • web端导航菜单系列

    导航菜单属于导航中最常规的一种导航模式 它有2个显而易见的用途 帮助我们找到想要的任何东西和告诉我们现在身在何处 帮助用户在不同页面之间跳转找到目标功能 导航作为网站或者平台的骨架 是产品设计中不容忽视的一环 结合自身对于导航设计的理解 并
  • Unknown initial character set index ‘255‘ received from server.Initial client character set can be..

    在MySQL8 0向DM8 达梦数据库 迁移数据时 使用默认驱动报错 报错信息 Unknown initial character set index 255 received from server Initial client char
  • 如何在Java中实现线程同步?

    在Java中 线程同步是一种机制 用于确保多个线程按照特定的顺序访问共享资源 从而避免数据竞争和不一致的结果 以下是几种常用的线程同步方法 synchronized关键字 synchronized关键字用于修饰方法或代码块 确保同一时间只有
  • 处理Element 日期选择器el-date-picker 限制时间跨度一年

    处理Element 日期选择器el date picker 限制时间跨度一年 主要通过pickerOptions里的disabledDate来控制禁止选中的日期 实现思想就是 当选中第一个开始日期时 拿到该时间戳计算时间范围 然后控制接下来
  • 【100天精通Python】Day57:Python 数据分析_Pandas数据描述性统计,分组聚合,数据透视表和相关性分析

    目录 1 描述性统计 Descriptive Statistics 2 数据分组和聚合 3 数据透视表 4 相关性分析 1 描述性统计 Descriptive Statistics 描述性统计是一种用于汇总和理解数据集的方法 它提供了关于数
  • 编译android版本llvm编译器

    编译android版本llvm编译器 准备 编译环境 ubuntu 20 04 2 编译器版本 ndk 24 0 8215888 llvm版本 15 0 7 最近需要在android上编译C 项目 需要在android上使用arm版本的编译