【问题标题】:Compiling cpp using LLVM 11.0.0 on Windows 10 mashine在 Windows 10 mashine 上使用 LLVM 11.0.0 编译 cpp
【发布时间】:2020-12-16 12:01:10
【问题描述】:

LLVM (Clang) 新手问题。我已经在一个清晰的 Windows 10 机器上安装了 LLVM 11.0.0。我需要做什么才能为 -target armv7a-none-eabi 获取 a.out?

    #include <stdio.h>
    #include <iostream>
    #include <vector>

    int main(void) {
        int counter = 0;
        counter++;
        printf("counter: %d\n", counter);
        
        printf("c++14 output:");
        
        std::vector<int> vect{1, 2, 3, 4, 5};

        for (auto & el : vect)
            std::cout << "-" << el << std::endl;

        return counter;
    }

请详细写下我必须做什么、从哪里获取所需的标头、在 PATH 中放置什么等等...

重要:

  1. 我需要交叉编译并获得 -target armv7a-none-eabi 的输出
  2. 该机器上没有安装 Visual Studio

【问题讨论】:

  • 这能回答你的问题吗? How run clang from command line on Windows?
  • 不,我要编译的机器上没有 Visual Studio
  • 我认为,为了获得有用的信息,您需要更加具体。了解目标平台是什么很重要。您确定您尝试使用的库可用于您的目标平台吗?如果有,你安装了吗?
  • 我不知道我是否必须安装 arm6.14.1,因为 arm6.14.1 中的所有文件都已经在 LLVM\bin 中??
  • 我正在尝试在 Windows 上获得 -target armv7a-none-eabi 的工作输出,这意味着我正在尝试在没有安装 Visual Studio 的机器上在 windows 上交叉编译 arm,这很重要,没有 Visual Studio。这就是我使用 MINGW(64 位)的原因

标签: c++ windows arm clang llvm


【解决方案1】:

通常,在为 Windows 安装 LLVM 时,路径变量会自动调整,因此您不必修改它。当然,在安装 LLVM 时,您必须确保安装与您的构建目标相关的所有文件(在您的情况下:armv7a-none-eabi)。

你需要做的是:

  1. 在终端中运行 shell(例如 PowerShell)。
  2. 切换到包含源文件的文件夹。
  3. 输入clang -target armv7a-none-eabi myfile.cpp(假设您的文件名为myfile.cpp)并按回车键。

帽子之后,你有一个a.exe 文件。

【讨论】:

  • 我正在尝试从 windows 交叉编译到 ARM。当我使用 clang 编译时,我得到一个缺少 stdio.h 的错误。当我使用 clang++ 编译时,我收到警告:无法找到 Visual Studio 安装。该怎么办?当我使用 -target armv7a-none-eabi 编译时,我丢失了 stdio.h。在没有安装 Visual Studio 的 WINdows 中如何编译?
  • 我安装了 Mingw(64 位),并将 C:\Mingw\bin 添加到 PATH。 C:\Program FIles\LLVM\bin 通过安装 LLVM 在 PATH 中。我尝试使用“C:\Program FIles\LLVM\bin\clang++.exe”-MD -x c++“test.cpp”“-IC:\Mingw\include”-> 错误“无法找到 Visual Studo 安装”进行编译我尝试编译: "C:\Program FIles\LLVM\bin\clang++.exe" -MD -x c++ "test.cpp" -target armv7a-none-eabi "-IC:\Mingw\include" "-IC :\Mingw\include\c++\3.4.5\"-> 找不到致命错误“bits/c++config.h”。 c++config.h 仅在“C:\Mingw\include\c++\3.4.5\mingw32\bits”文件夹中。帮忙??
【解决方案2】:

坏消息是,您不能真正轻松地完成您所要求的事情。除非您非常雄心勃勃或负责创建可以满足您要求的开发人员工具链,否则您无需为下面的其余部分烦恼。切换到具有易于安装 (gcc) 交叉工具链的平台(如 Ubuntu linux),或向您的 BSP 供应商询问基于 clang 的 Windows 交叉工具链。


LLVM 社区在https://releases.llvm.org/ 提供的发布 tarball 最适合原生构建。是的,它们包括编译器、汇编器、链接器、C++ 库。它们都可以作为本地工具链很好地协同工作(但默认情况下将引用本地主机 C 库和本地主机链接器)。是的,包含的编译器/汇编器确实支持所有 LLVM 目标。但是你不想要一个编译器,你想要一个工具链。一个完整的跨目标 C/C++ 工具链通常包括:

  1. 声明类型和函数的操作系统标头
  2. 引用 OS 头文件并声明类型和函数的 C 库头文件、定义函数的库/共享对象存档。
  3. 声明模板、类型和函数的 C++ 库头文件,定义函数的库/共享对象存档。
  4. 目标链接器
  5. binutils:独立汇编器、objcopy、objdump、归档器等。

使用上面的#2,您可以调用printf(),链接器将能够在C 库存档中找到它的实现。然后,您链接的 ./a.out 可执行文件可以运行该 printf 代码并期望它向某些控制台或半主机输出发出一些东西。

我正在尝试从 Windows 交叉编译到 ARM。当我编译时 铿锵声,我收到一个缺少 stdio.h 的错误。当我用 clang++ 编译时,我 收到警告:找不到 Visual Studio 安装。该怎么办? 当我使用 -target armv7a-none-eabi 编译时,我丢失了 stdio.h。

armv7a-none-eabi 描述了一个没有操作系统的目标。如果我们有一个声明 printf 的 stdio.h,那将使我们成为其中的一部分。但是对于这个特定目标,printf() 实现应该发生什么?

大多数用户想要的是提供 C 库头文件和存档的供应商——打包 C 库的商业或开源分销商。通常它们与工具链本身捆绑在一起。有时开发板和相应的工具链包含在一个大包/BSP 中。

由于您特别要求armv7a-none-eabi,我强烈建议您找到供应商来满足您的需求。特别是如果您需要使用 Windows 主机。

如果您没有卡在 Windows 上,或者愿意使用 WSL:Debian 和 Ubuntu 提供交叉工具链和 C 库(包括像 libnewlib-arm-none-eabi 这样的库)。不幸的是,我认为没有任何基于 clang 的跨工具链可以利用这个 C 库。

虽然您可以尝试将libnewlib-arm-none-eabi 与来自https://releases.llvm.org/ 的clang tarball 绑定,但这并不是特别容易。我将首先查看https://releases.llvm.org/11.0.0/tools/clang/docs/UsersManual.html#configuration-files - 创建一个引用相关包含路径和库路径的配置文件。

配置文件原型化后,从小处着手并构建:

  1. 尝试从int foo(void) { return 33; } 为您的目标编译一个目标文件。
  2. 尝试从带有int main(void) {} 的.c 文件构建可执行文件
  3. 尝试通过调用 printf() 从 .c 文件构建可执行文件。

如果您完成了这三个步骤,那么恭喜您,您可能需要解决很多有趣的挑战。如果你想让std::cout 和朋友们工作,你需要为你的目标构建一个 C++ 库。您可以使用 libc++/libc++abi 或 libstdc++。裸机/独立目标上的 C++ 库可能不是很常见。也就是说,有很多 C++ 库内容几乎没有系统依赖性。尤其是专注于 STL 的 C++98/03 内容——它们可能只依赖于系统堆分配器。您的示例仅显示std::vector&lt;&gt;std::cout,因此它可能是可行的。

【讨论】:

  • 布莱恩凯恩,我喜欢你的回答!因此,这意味着我必须在拥有 Visual Studio 2017 的开发人员机器上构建自己的工具链。所以,我已经获得了 LLVM llvm-11.0.0.src.tar.xz 的源代码,我使用 CMAKE 启用了每个项目,我使用了以下内容:cmake -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;compiler-rt;libc;libclc;libcxx;libcxxabi;libunwind;clang_rt;lld;mlir;parallel-libs; pstl" -G "Visual Studio 15 2017" -A x64 -Thost=x64 ../llvm 我已经打开了 ALL_BUILD.vcxproj,并构建了一切。
  • 那么,我是否为 ARM 编译了所有内容?还是我必须做其他事情?
  • 或者我是否必须做一些完全不同的事情才能在 Windows 上获得 ARM 的工具链?我刚刚获取了第一个目标条目,但在使用 CLang 编译时可能会使用其他一些 ARM 目标。使用 MinGW 的标头怎么样?
  • 或者,另一个问题,有没有一种有意义的方法可以在 Linux 上为 ARM 生成库和头文件,将生成的库和头文件传输到 Windows 并在 Windows 上使用? LLVM 附带的库和头文件呢,它们不用于交叉编译吗?
  • 我希望如果您有一个目标 C 库安装树(头文件、目标存档/共享对象),那么无论您是从 Windows 系统还是从 linux 系统获得它都可能无关紧要。如果你想创建自己的交叉工具链,你应该选择一个适合你的目标三元组和你的用例的 C 库。
猜你喜欢
  • 2017-04-14
  • 2015-04-24
  • 2016-05-25
  • 1970-01-01
  • 1970-01-01
  • 2018-11-28
  • 2019-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多