- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在运行 Ubuntu 20.04 Focal 的 AArch64 Raspberry Pi 4 上使用 clang-11。我看了https://apt.llvm.org/ , 但 AArch64 预构建二进制文件似乎不可用?
我尝试直接在 Raspberry Pi 上构建 clang,但速度非常慢,最后我的 SD 卡空间不足。
如何在我的 x64 笔记本电脑上自己交叉编译 clang?
最佳答案
构建 LLVM 可能会很棘手,因为它需要大量的计算资源,这使得很难使用不同的构建选项进行迭代。我第一次尝试为我的 AArch64 Raspberry PI 构建主干版本的 clang 最终得到了一个 ARM7 的构建,并且大小也是 30GB,这不适合存储卡。糟糕。
第一个相关的 Clang 文档页面是 Building LLVM with CMake .它解释了 CMake 选项 CMAKE_BUILD_TYPE
、CMAKE_INSTALL_PREFIX
和 LLVM_TARGETS_TO_BUILD
。
设置 -DCMAKE_BUILD_TYPE=MinSizeRel
或默认 Debug
以外的其他值是个好主意。 clang 的调试版本运行速度会明显变慢。自定义 CMAKE_INSTALL_PREFIX
是必要的,因为您不想将 Clang 安装到您的主机系统上。给它 -DCMAKE_INSTALL_PREFIX=$PWD/install
,然后将安装目录复制到你的 AArch64 机器上。
要减小安装大小,请设置 -DLLVM_TARGETS_TO_BUILD=AArch64
。默认情况下构建所有目标。
如果你想使用最先进的功能,这很可能,否则,为什么要编译 clang,你会希望在 clang 代码中启用断言,并且你会想要调试符号。它会减慢程序速度并使其变大,但由于提高了安全性和可调试性,因此绝对值得。查看Getting the Source Code and Building LLVM并在这种情况下设置 -DCMAKE_BUILD_TYPE=RelWithDebInfo -DLLVM_ENABLE_ASSERTIONS=On
。
接下来,阅读 Building a Distribution of LLVM .相关建议是通过设置 -DLLVM_BUILD_LLVM_DYLIB=On -DLLVM_LINK_LLVM_DYLIB=On -DLLVM_INSTALL_TOOLCHAIN_ONLY=On
进一步最小化安装大小。
最后,读How To Cross-Compile Clang/LLVM using Clang/LLVM .即使您计划使用 GCC 进行交叉编译,此页面也很有帮助。如果您正在使用 Ubuntu Focal,无论是直接使用还是在 Docker 容器中构建,您最终可能会得到 CMake 命令的骨架,例如
CC=aarch64-linux-gnu-gcc-10 CXX=aarch64-linux-gnu-g++-10 cmake ../llvm \
-DCMAKE_CROSSCOMPILING=True \
-DLLVM_TARGET_ARCH=AArch64 \
-DLLVM_DEFAULT_TARGET_TRIPLE=aarch64-linux-gnueabihf \
-DCMAKE_CXX_FLAGS='-march=armv8-a -mtune=cortex-a72' \
-GNinja
那里的选项应该很简单,除了 LLVM_TABLEGEN
和 CLANG_TABLEGEN
。它们必须被指定,因为这些二进制文件需要在主机上运行,但是构建会为目标编译它们,所以它不能使用它刚刚构建的东西。现有二进制文件必须由您提供。虽然 llvm-tblgen 可以与 llvm 包一起安装,但 clang-tblgen 不是发行版的一部分。这意味着,您需要进行两次构建。首先,为主机构建这两个二进制文件(您不必构建完整的 LLVM,这两个二进制文件就足够了),然后将交叉编译指向它们。
mkdir build-host
cd build-host
CC=gcc-10 CXX=g++-10 cmake ../llvm -DLLVM_ENABLE_PROJECTS='clang;compiler-rt;lld;clang-tools-extra' -GNinja
ninja llvm-tblgen clang-tblgen
现在,在你的交叉构建中使用这些二进制文件,所以添加到你的 CMake 命令中
-DLLVM_TABLEGEN=/usr/bin/llvm-tblgen-11 -DCLANG_TABLEGEN=/mnt/repos/llvm-project/build-host/bin/clang-tblgen
建议将包含 llvm 源的目录从文件系统挂载到容器中。这将使编译结果更容易输出,而且 native 文件系统比 docker 中的覆盖更快。
docker run -v `pwd`:/mnt --rm -it ubuntu:focal bash
在 Ubuntu 20.04 Focal 上
apt install g++-10-aarch64-linux-gnu libstdc++-10-dev-arm64-cross gcc-10 g++-10
apt install cmake ninja-build python3
mkdir build-aarch64
cd build-aarch64
CC=aarch64-linux-gnu-gcc-10 CXX=aarch64-linux-gnu-g++-10 cmake ../llvm \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DLLVM_ENABLE_ASSERTIONS=On \
-DCMAKE_CROSSCOMPILING=True \
-DCMAKE_INSTALL_PREFIX=install \
-DLLVM_DEFAULT_TARGET_TRIPLE=aarch64-linux-gnueabihf \
-DLLVM_TARGET_ARCH=AArch64 \
-DLLVM_TARGETS_TO_BUILD=AArch64 \
-DCMAKE_CXX_FLAGS='-march=armv8-a -mtune=cortex-a72' \
-GNinja \
-DLLVM_ENABLE_PROJECTS='clang;compiler-rt;lld;clang-tools-extra' \
-DLLVM_TABLEGEN=/mnt/repos/llvm-project/build-host/bin/llvm-tblgen \
-DCLANG_TABLEGEN=/mnt/repos/llvm-project/build-host/bin/clang-tblgen \
-DLLVM_BUILD_LLVM_DYLIB=On \
-DLLVM_LINK_LLVM_DYLIB=On \
-DLLVM_INSTALL_TOOLCHAIN_ONLY=On
如果可以的话,获得一台强大的构建机器。链接一些二进制文件需要大量 RAM。您应该有大约 20 GB 的可用内存,以便能够在合理的时间内到达任何地方,64 GB 会更好。如果碰巧并行运行的多个链接任务耗尽了您的机器内存,请尝试使用 ninja -j3
左右进行编译,以将并行任务的数量限制为例如 3。
ninja install -j3
使用不同的链接器应该可以减少内存需求。据推测,ld.gold 在链接时具有较低的内存要求。
关于cross-compiling - 如何在 x64 主机上为 AArch64 交叉编译 LLVM/Clang?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61771494/
我正在尝试自己编译跨平台工具链。 当我编译 binutils-2.22 时,它成功了,但为什么会出现“检查我们是否正在交叉编译...否”?我想应该是"is",对吧? 我的主机是运行 ubuntu 的
设置: 有远程测量站,有集中收集/处理/呈现服务器(带有网络服务器),还有观测站,为客户显示收集到的数据。 这些观测站由简单的嵌入式计算机组成,配备网络浏览器,以信息亭模式工作,每个观测站显示来自中央
我对 Spark 和 Scala 很陌生,我正在编写 Spark SQL 代码。我可以在我的逻辑中应用 CROSS JOIN 和 CROSS APPLY。在这里,我将发布必须转换为 Spark SQL
警告是: jquery-1.9.1.js:8526 跨源读取阻止 (CORB) 阻止跨源响应 https://www.metaweather.com/api/location/search/?quer
我正在尝试对用户进行身份验证,但由于Cross-Origin Read Blocking (CORB) blocked 问题我的 login.ts 代码是 if (this.plugins.isOnl
这是我的表格 public class TaskForm extends WebForm { public TaskForm(){ this(new TaskModel());
首先,对不起我的英语语言不好,我是初学者程序员。在我的项目中,我使用线程类,但完成后我看到了这个异常: Cross-thread operation not valid: Control 'lblp4
我目前正在为一个项目开发前端(VueJS),为了测试我的登录和注册逻辑,我使用 laravel 作为后端,尽管我们实际上将使用 springboot 作为后端。我在桌面上编码,一切正常。所以我开始使用
我一直认为,就主要浏览器在不同平台上的渲染而言,唯一的区别是操作系统的底层字体渲染技术,其他一切都依赖于浏览器中包含的相同库。 就我的研究而言,前端开发人员要么相信,要么不相信。似乎我们可以选择任何一
我需要在我正在处理的网站中显示一些交互式(附加 DOM 监听器等和事件处理)矢量图形。 W3C 推荐了 SVG,尽管 Internet Explorer 支持仍然无法识别这种格式,这是必须的(对于公共
子域是否有跨域策略限制? 如果我在 paint.xxxx.com 上有申请这是处理来自 image.xxxx.com 的图像,有没有跨域问题? 我问这些问题,因为我正在考虑在子域上放置一个代理。 最佳
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 6年前关闭。 Improve this questi
一个项目迫在眉睫,我将要编写的一些代码可能会部署在潜在客户碰巧拥有的任何硬件上。它是一个 24/7 全天候运行的业务应用程序,因此我设想大多数主机将是服务器类型的机器,但较小的客户端可能只有一台简单的
首先,我不反对Opera。似乎当我遇到跨浏览器问题并进行一些研究时,总能找到“解决办法”,但是随后我看到一条评论,说我正在查看的跨浏览器解决方案无法在Opera中使用,这是一种愚蠢的评论。 我应该在乎
作为优秀的开发人员,我们尽可能保持我们的代码符合标准,以帮助平台之间的移植。但是有哪些工具可以帮助我们以统一的方式跨多个平台构建代码。 *nix 家族有 make但 Windows 需要 nmake
我目前正在构建浏览器帮助对象。 的事情之一BHO要做的是绕过跨域策略进行跨站请求。 为此,我公开了 __MyBHONameSpace.Request使用 WebClient 的方法内部。 然而,我想到
我开发了一个 NP API 插件并正在使用它。我观察到以下两件事 当我第一次安装插件时,我需要重新启动我的 mac os 以加载插件。 每当我更新插件时,我都需要重新启动浏览器。 我想在不重新启动浏览
浏览器在接收到“足够”的数据后或数据停止流入后呈现内容(例如,达到内容长度)。 我要慢慢地将数据流式传输到浏览器;为此,我必须解决此数据缓存问题。 例如,不是发送 40 字节的 JavaScript,
我搜索了一些关于跨平台编程开发的文献,但没有找到真正好的东西。 我不是在寻找像 Java 那样的跨平台虚拟机。 有没有关于这方面的书籍或文献? 最佳答案 我会说这归结为: 不使用非标准的“标准库”功能
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 7年前关闭。 Improve t
我是一名优秀的程序员,十分优秀!