最近我一直在使用GCC进行交叉编译,并发现了一个看似复杂的区域,即工具链.
我不太明白这一点,因为我认为GCC可以为大多数常见架构创建二进制机器代码,而其他真正重要的是你链接的库和创建的可执行类型.
海湾合作委员会不能自己做所有这些事吗?通过单一构建的GCC,所有适当的库和发送到GCC的正确标志,我可以为Windows x86机器生成PE可执行文件,然后为嵌入式Linux MIPS设备创建ELF可执行文件,最后为OSX PowerPC创建可执行文件机?如果没有,有人可以解释你将如何实现这一目标?
我在Buildroot Linux发行版ARM(Python 2.7.2)下交叉编译netifaces扩展时遇到了问题.根据这个博客http://whatschrisdoing.com/blog/2009/10/16/cross-compiling-python-extensions/我已经定义了CC,LDSHARE等环境变量,但是distutils/setuptools没有将CC带入帐户,所以所有测试都将失败:
running build
Setting prefix
Setting prefix
running build_ext
checking for getifaddrs... not found. (cached)
checking for getnameinfo... not found. (cached)
checking for socket IOCTLs... not found. (cached)
checking for optional header files... netash/ash.h netatalk/at.h netax25/ax25.h neteconet/ec.h netipx/ipx.h netpacket/packet.h linux/irda.h linux/atm.h linux/llc.h linux/tipc.h linux/dn.h. (cached)
checking whether struct sockaddr has a length field... no. (cached)
checking which sockaddr_xxx structs are defined... at ax25 in in6 ipx un ash ec ll atmpvc atmsvc dn irda llc. (cached) …Run Code Online (Sandbox Code Playgroud) 总之,我试图用CMake交叉编译CMake,我认为我没有正确地链接库.我想做的可能是不可能的,但我至少想知道为什么不可能,如果是这样的话.
系统:主机是带有Cavium ARM9 CPU 的Linux机箱.它目前正在运行Linux内核版本2.6.24.4和Debian 5.0(Lenny).我的工作站是运行Ubuntu 12.04 LTS(精确穿山甲)的Core i5.
我的总体目标是在Linux机器上运行ROS.我必须从源代码编译而不是使用apt,因为Debian 6.0(Squeeze)二进制文件需要Cavium不提供的拇指支持,并且Debian 5.0(Lenny)不需要很多所需的软件包.我在安装所需的各种库方面取得了进展,但是当我进入步骤1.3.1并尝试运行CMake时,我收到了错误
需要CMake 2.8或更高版本.您正在运行2.6.0版
接下来我尝试在Linux机器上下载并构建CMake 2.8.8,但这对系统来说太过分了.当失败时,我下载了制造商网站上建议的工具链,并使用[www.cmake.org/Wiki/CMake_Cross_Compiling]上的交叉编译指南来构建CMake可执行文件.这是我的工具链文件:
# This one is important
SET(CMAKE_SYSTEM_NAME Linux)
# Specify the cross compiler
SET(CMAKE_C_COMPILER /pathto/crosstool-linux-gcc-4.5.2-gclibc-2.9-oabi/arm-unknown-linux-gnu/bin/arm-unknown-linux-gnu-gcc)
SET(CMAKE_CXX_COMPILER /pathto/crosstool-linux-gcc-4.5.2-gclibc-2.9-oabi/arm-unknown-linux-gnu/bin/arm-unknown-linux-gnu-g++)
# Where is the target environment
SET(CMAKE_FIND_ROOT_PATH /pathto/crosstool-linux-gcc-4.5.2-gclibc-2.9-oabi/arm-unknown-linux-gnu /pathto/crosstool-linux-gcc-4.5.2-gclibc-2.9-oabi/arm-unknown-linux-gnu/arm-unknown-linux-gnu)
# Search for programs in the build host directories
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# For libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
Run Code Online (Sandbox Code Playgroud)
但是,在Linux机器上使用二进制文件会产生错误
cmake:/usr/lib/libstdc++.so.6:找不到版本`GLIBCXX_3.4.14'(cmake要求)
果然,图书馆不在那里:
prompt# strings /usr/lib/libstdc++.so.6 | …Run Code Online (Sandbox Code Playgroud) 我已经成功创建了一个ghc交叉编译器,它允许我从我的x64 linux机器编译armv6h的haskell代码(在我的例子中是raspberry pi).我已成功在树莓上运行了一个hello world程序.
不,我想构建我真正的应用程序,它对其他haskell模块有很多依赖.当我为x64编译时,我就是这么做的
cabal install dependenciy1 depenency2 ...
Run Code Online (Sandbox Code Playgroud)
我知道我可以让我自己的程序成为一个cabal项目,自动完成这一步.但这不是重点.
当我尝试使用交叉编译器时
arm-unknown-linux-gnueabi-ghc --make myapp.hs
Run Code Online (Sandbox Code Playgroud)
它告诉我它找不到的模块.当然,他们没有安装!
我阅读https://ghc.haskell.org/trac/ghc/wiki/Building/CrossCompiling 并根据我尝试过
cabal --with-ghc=arm-unknown-linux-gnueabi-ghc --with-ghc-pkg=arm-unknown-linux-gnueabi-ghc-pkg --with-ld=arm-unknown-linux-gnueabi-ld install random
Run Code Online (Sandbox Code Playgroud)
随机是我正在尝试安装的依赖性.我收到以下错误:
Resolving dependencies...
Configuring random-1.0.1.3...
Failed to install random-1.0.1.3
Last 10 lines of the build log ( /home/daniel/.cabal/logs/random-1.0.1.3.log ):
/home/daniel/.cabal/setup-exe-cache/setup-Cabal-1.18.1.3-arm-linux-ghc-7.8.3.20140804: /home/daniel/.cabal/setup-exe-cache/setup-Cabal-1.18.1.3-arm-linux-ghc-7.8.3.20140804: cannot execute binary file
cabal: Error: some packages failed to install:
random-1.0.1.3 failed during the configure step. The exception was:
ExitFailure 126
Run Code Online (Sandbox Code Playgroud)
当我做
file /home/daniel/.cabal/setup-exe-cache/setup-Cabal-1.18.1.3-arm-linux-ghc-7.8.3.20140804
Run Code Online (Sandbox Code Playgroud)
我明白了
/home/daniel/.cabal/setup-exe-cache/setup-Cabal-1.18.1.3-arm-linux-ghc-7.8.3.20140804: ELF 32-bit LSB executable, ARM, EABI5 version …Run Code Online (Sandbox Code Playgroud) 我正在开发一个小型库,出于明显的原因,我想使用所有Java 11功能(我现在猜不到的模块除外)来生成代码,但是我希望该库与Java 8及更高版本兼容。
当我尝试这个:
javac -source 11 -target 1.8 App.java
Run Code Online (Sandbox Code Playgroud)
我收到以下消息:
warning: source release 11 requires target release 11
Run Code Online (Sandbox Code Playgroud)
...当我查看字节码时,我看到该类的版本为0x37(Java 11):
$ xxd App.class
00000000: cafe babe 0000 0037 ...
Run Code Online (Sandbox Code Playgroud)
Java 8无法加载它:
Exception in thread "main" java.lang.UnsupportedClassVersionError: App has been
compiled by a more recent version of the Java Runtime (class file version 55.0),
this version of the Java Runtime only recognizes class file versions up to 52.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)
at …Run Code Online (Sandbox Code Playgroud) 我正在尝试在我的 M1 Mac 上为 Linux 的 x86_64 目标编译 Rust 代码。我使用 Docker 来实现这一点。
我的 Dockerfile:
FROM rust:latest AS builder
RUN rustup install stable-x86_64-unknown-linux-musl
RUN rustup target add x86_64-unknown-linux-musl
RUN apt -y update
RUN apt install -y musl-tools musl-dev
RUN apt-get install -y build-essential
RUN apt install -y gcc-x86-64-linux-gnu
ADD ./cargo ./cargo/
WORKDIR /cargo
ENV RUSTFLAGS='-C linker=x86_64-linux-gnu-gcc'
ENV CC='gcc'
ENV CC_x86_64_unknown_linux_musl=gcc-x86-64-linux-gnu
ENV CC_x86_64-unknown-linux-musl=gcc-x86-64-linux-gnu
RUN cargo build --target x86_64-unknown-linux-musl --release
Run Code Online (Sandbox Code Playgroud)
但我会得到错误
发生错误:找不到工具。是否已
gcc-x86-64-linux-gnu安装?
我认为应该安装它,因为我安装了它apt install -y gcc-x86-64-linux-gnu。
有人知道为什么会发生这种情况吗?
完整输出:
docker …
该文档适用于Mac OS X和Linux,我希望知道如何在Windows平台上编译Golang包.在Windows上,我不知道如何编写make文件以及使用哪个工具来创建它.
似乎没有一个名为make或go的工具可以与Go开发工具的安装文件一起使用.
谢谢.
有谁知道如何跨ARM编译OpenSSH?这就是我所做的:
首先,我已经下载了Zlib源代码,解压缩它,构建它并使用以下命令行安装它:
# ./configure --prefix=/usr/local/cross/arm
# make
# make install
Run Code Online (Sandbox Code Playgroud)
但是当我尝试为ARM目标板编译OpenSSH时,它会在此./configure过程中给出错误"zlib missing" :
# sudo LDFLAGS=-L/usr/local/cross/arm/lib CC=arm-none-linux-gnueabi-gcc PATH=$PATH:/home/arishop/arm-tool-chain/arm-fsl-linux-gnueabi/bin/ ./configure --host=arm-linux --with-zlib=/usr/local/cross/arm/ --prefix=/usr/local/cross/arm/openssh
Run Code Online (Sandbox Code Playgroud) 我已经下载了PHP 5.4.0源代码,将其解压缩并移动到源文件夹中.
我做配置:
./configure --build=x86_64-unknown-linux-gnu --host=arm-linux-uclibcgnueabi --prefix=/usr/arm/www CC="arm-linux-uclibcgnueabi-gcc --sysroot=/toolchains/gnu_cortex-a9_tools/" --disable-libxml --disable-dom --without-iconv --without-openssl --disable-simplexml --disable-xml --disable-xmlreader --disable-xmlwriter --without-pear --without-sqlite3 --disable-pdo --without-pdo-sqlite --disable-phar --with-config-file-path=/etc/
Run Code Online (Sandbox Code Playgroud)
其次是
make
Run Code Online (Sandbox Code Playgroud)
没有错误,一切都运行良好.接下来我做一个make install.
make install
Run Code Online (Sandbox Code Playgroud)
一切都运行良好.我将它移动到目标平台并运行
/usr/arm/www/bin/php -v
PHP 5.4.0 (cli) (built: Aug 15 2012 16:07:41)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies
Run Code Online (Sandbox Code Playgroud)
我用我的网络服务器和php直接测试一个简单的主页.
<?php echo "hello" ?>
# php index.php
hello
Run Code Online (Sandbox Code Playgroud)
它按预期工作.接下来我测试:
<?php
$output = shell_exec('ls -lart');
echo "<pre>$output</pre>";
?>
Run Code Online (Sandbox Code Playgroud)
哦,不!
# php shell.php
Segmentation fault
Run Code Online (Sandbox Code Playgroud)
我设定了另一个脚本:
#!/bin/php …Run Code Online (Sandbox Code Playgroud) 我正在尝试针对Mips处理器交叉编译Azure IoT SDKC。使用较旧版本的CMake(2.8.12.2)交叉编译同一SDK的较旧版本是否可以正常工作,因此我怀疑它本身就是代码。我猜这是Mips GCC编译器。
错误信息:
CMake Error at /usr/share/cmake-3.10/Modules/CMakeTestCCompiler.cmake:52 (message):
The C compiler
"/usr/local/mipsisa32r2el/r23/bin/mipsisa32r2el-axis-linux-gnu-gcc"
is not able to compile a simple test program.
It fails with the following output:
Change Dir: /home/axis/azure-iot-sdk-c/cmake/iotsdk_linux/CMakeFiles/CMakeTmp
Run Build Command:"/usr/bin/make" "cmTC_2cc84/fast"
/usr/bin/make -f CMakeFiles/cmTC_2cc84.dir/build.make CMakeFiles/cmTC_2cc84.dir/build
make[1]: Entering directory '/home/axis/azure-iot-sdk-c/cmake/iotsdk_linux/CMakeFiles/CMakeTmp'
Building C object CMakeFiles/cmTC_2cc84.dir/testCCompiler.c.o
/usr/local/mipsisa32r2el/r23/bin/mipsisa32r2el-axis-linux-gnu-gcc --sysroot=/usr/local/mipsisa32r2el/r23 -o CMakeFiles/cmTC_2cc84.dir/testCCompiler.c.o -c /home/axis/azure-iot-sdk-c/cmake/iotsdk_linux/CMakeFiles/CMakeTmp/testCCompiler.c
Linking C executable cmTC_2cc84
/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_2cc84.dir/link.txt --verbose=1
/usr/local/mipsisa32r2el/r23/bin/mipsisa32r2el-axis-linux-gnu-gcc --sysroot=/usr/local/mipsisa32r2el/r23 -rdynamic CMakeFiles/cmTC_2cc84.dir/testCCompiler.c.o -o cmTC_2cc84
/usr/local/mipsisa32r2el/r23/lib/gcc/mipsisa32r2el-axis-linux-gnu/4.7.2/../../../../mipsisa32r2el-axis-linux-gnu/bin/ld: this linker was not configured to use sysroots
collect2: error: …Run Code Online (Sandbox Code Playgroud)