clang - 如何使用 clang/LLVM 交叉编译 Coreutils 或其他 GNU 项目?
问题描述
我非常需要用llvm为其他arch编译Coreutils:arm/aarch64/mips/mips32/ppc/ppc32 ...
因为我安装了所有的 gcc-cross 工具mips-linux-gnu
,powerpc64-linux-gnu
如果我有一个像 test.c 这样的简单 C 程序
#include<stdio.h>
int main(){
printf("hello!");
return 0;
}
我可以将它编译到拱门,即
clang --target=mips64-linux-gnuabi64 test.c -o test-mips64
➜ tests file test-mips64
test-mips64: ELF 64-bit MSB executable, MIPS, MIPS64 rel2 version 1 (SYSV), dynamically linked, interpreter /lib64/ld.so.1, BuildID[sha1]=7b33d55a0d08e6cd18d966341590dc351e346a78, for GNU/Linux 3.2.0, not stripped
我尝试以相同的方式编译尝试设置的 Coreutils
export CC=clang
export CXX=clang++
CFLAGS = "--target=mips64-linux-gnuabi64"
./configure --host=mips64-linux-gnuabi64
但是,每次配置或制作时都会出错...
我应该如何设置配置?我可以很容易地用 llvm 为其他拱编译 Coreuntils 吗?
解决方案
让命令行选项正确用于交叉编译有点棘手。假设您正在使用基于 Debian 的系统(如 Debian 或 Ubuntu),我让它可以使用以下命令。以下是步骤。
- 安装
gcc-mips64-linux-gnuabi64
和gcc-powerpc64-linux-gnu
. - 选择正确的论据
CFLAGS
-B/usr/mips64-linux-gnuabi64/bin/
表示我们要ld
在该目录中使用链接器。对 powerpc 执行相同的操作。--target=mips64-linux-gnuabi64
表明我们的编译目标是什么。对 powerpc 执行相同的操作。-I/usr/mips64-linux-gnuabi64/include
包括头文件。对 powerpc 执行相同的操作。
- 用于
./configure --host=mips64-linux-gnuabi
配置 mips64 和./configure --host=powerpc64-linux-gnueabi
配置 powerpc64。
以下是为 mips64 编译的命令:
make clean
CFLAGS="-B/usr/mips64-linux-gnuabi64/bin/ --target=mips64-linux-gnuabi64 -I/usr/mips64-linux-gnuabi64/include" \
./configure --host=mips64-linux-gnuabi
make
以及为 powerpc64 编译的命令:
make clean
CFLAGS="-B/usr/powerpc64-linux-gnu/bin/ --target=powerpc64-linux-gnueabi -I/usr/powerpc64-linux-gnu/include" \
./configure --host=powerpc64-linux-gnueabi
make
这是file ./src/ls
证明它是一个 powerpc64 可执行文件的输出:
$ file ./src/ls
./src/ls: ELF 64-bit MSB executable, 64-bit PowerPC or cisco 7500, version 1 (SYSV), dynamically linked, interpreter /lib64/ld64.so.1, for GNU/Linux 3.2.0, BuildID[sha1]=97fe33981ca0112160f44a6fb678d6dc1b462114, not stripped
下面是一个 Dockerfile,可用于为 mips64 和 powerpc64 可重复地交叉编译 coreutils。
# Cross-compile GNU coreutils for mips64 and powerpc64 using clang.
# With help from https://medium.com/@wolfv/cross-compiling-arm-on-travis-using-clang-and-qemu-2b9702d7c6f3
FROM debian:buster
# Install compile-time dependencies.
RUN apt-get update \
&& apt-get install --yes \
clang \
curl \
gcc-mips64-linux-gnuabi64 \
gcc-powerpc64-linux-gnu \
make \
perl \
&& rm -rf /var/lib/apt/lists/*
# Download source code for release.
WORKDIR /tmp/coreutils
RUN curl -fsSL https://ftp.gnu.org/gnu/coreutils/coreutils-8.32.tar.xz \
| tar xJ --strip-components 1
# Compile and install for mips64.
RUN CFLAGS="-B/usr/mips64-linux-gnuabi64/bin/ --target=mips64-linux-gnuabi64 -I/usr/mips64-linux-gnuabi64/include" \
./configure --host=mips64-linux-gnuabi --prefix=/opt/coreutils-mips \
&& make \
&& make install
# Compile and install for powerpc64.
RUN make clean \
&& CFLAGS="-B/usr/powerpc64-linux-gnu/bin/ --target=powerpc64-linux-gnueabi -I/usr/powerpc64-linux-gnu/include" \
./configure --host=powerpc64-linux-gnueabi --prefix=/opt/coreutils-powerpc64 \
&& make \
&& make install
# Keep only the compiled programs from the previous stage.
FROM debian:buster
COPY --from=0 /opt /opt
推荐阅读
- oracle - 使用 %found 和 %notfound
- java - 为什么 Locale(String) 构造函数在 Java 中不能正常工作?
- android - 无法获取未知属性“navigationVersion”
- ios - iOS TextField - 自动完成添加空白字符
- java - 如何将依赖项注入 Spark main 方法?
- regex - 如何使用 QRegExp 和 QString 获取图像标签的 src
- collision-detection - 立方体内任意光线的出射点
- sql - SQL VBA 查询将只返回小数据集的结果
- python - 给定一个长度为 x 的列表,重复它以获得长度为 n 的列表
- codeception - AspectMock 没有模拟类的构造函数