window下交叉编译出arm的应用程序与动态库(非裸奔 | 带下载)

需求:一个可以直接使用window命令控制的,使用Makefile编译出一个可以直接在arm系统上使用的一个so。

    查找到的资料:
    yagarto和codesourcery都是在windows下用的,官方已经编译打包好的EXE文件
    cygwin下可以自己编译源代码,做出GNU工具链
    mingw也可以实现
    还有一些在windows下用的IDE,专门针对GNU工具链的,code::blocks,emide等

LLVM的实现在这:https://blog.csdn.net/qq_37887537/article/details/106327600

 

实现方案探寻(我是最后一种成功了):

    1.在window上直接利用cygwin的环境交叉编译器arm-elf-gcc编译出的是arm的二进制程序:

链接:https://pan.baidu.com/s/1oKqzQ1x1U3d_9y51YrDwGg 密码:2eer

下载解压,直接将GUNARM/bin添加到window环境变量中就可以使用window命令来使用。但是不是我想要的。

 

    2.ADS软件也可以编译arm可执行文件。

是一款独立的软件,编译的好像也是裸奔的,与需求不符。

 

    3.arm-linux-gcc在cygwin上编译:

方式一:

下载脚本文件http://buildroot.uclibc.org/downloads/snapshots/buildroot-snapshot.tar.bz2

tar xvjf buildroot-snapshot.tar.bz2
cd buildroot
make menuconfig:这里出错了,说fork: Resource temporarily unavailable! 重装了一下,可以使用了!

里面有许多选项,主要修改了其中的交叉编译器选项,乱改一通啊

make

报错:You must install 'cpio' on your build machine!无解中。。。

 

方式二:

链接:https://pan.baidu.com/s/1k21m3wIsNRdtNW0VBGNEjg 密码:1fyq,里面有一个完整的文档。

使用的是crosstool进行安装

但是在编译linux中arch/arm/.config文件时出错,没有正确生成?

我换成64位的cygwin又试了试,报crosstool: bug: BUILD not set?!

 

    4.Mingw做arm交叉编译:

方式一:参考文档:codeSourcery交叉编译环境

他的文档比较乱的,也可以看一下我这个目的性强的版本:

(一)直接下载Window上的最新的直接安装包,一切默认安装即可。下载链接:https://pan.baidu.com/s/1pg5WIi2d0tBROPn11_3z1g 密码:3pvi。

(二)将C:\Users\Administrator\MentorGraphics\Sourcery_CodeBench_Lite_for_ARM_GNU_Linux\bin的默认安装路径(如果你安装文件的时候改了路径,请记得修改),添加到Window全局环境变量中。

(三)编写一个简单的hello.c程序,输入下面的命令编译first.c文件(需要加-static选项)。

# arm-none-linux-gnueabi-gcc -static -o hello hello.c

(四)将hello发送到arm的板子上面即可。./hello查看你的helloworld.

    这样就简单的完成了一个应用程序,而不是裸机程序了。下面可以试着做一个我们所需要的so了、

# arm-none-linux-gnueabi-gcc -shared -fPIC ///

./a.out一下,又出现问题: cannot open shared object file: No such file or directory!

ldd a.out:



111@debian:~$ ldd a.out
        libhello.so => Not found (0xb6f24000)
        libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0xb6e32000)
        /lib/ld-linux-armhf.so.3 (0xb6f2f000)

FILE一下我编译出来的so:

ELF 32-bit LSB shared object, ARM, version 1 (SYSV), dynamically linked, not stripped

正常的so:

 ELF 32-bit LSB shared object, ARM, version 1 (SYSV), dynamically linked, BuildID[sha1]=0x6dd5dfefc362981dd11eac77d7f793727c24f8a8, stripped

没有BuildID?不知道是不是so没有正常的ID的原因,无法找到我编译出来的so!

可以尝试 --build-id=sha1~

 

5.更多尝试!

colinux貌似不错,但是好像是64位装不了的.

还有一家希望,我成功了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

6.使用Linaro的arm-linux-gnueabihf-gcc的交叉编译工具

这个是类似于第4种codeSourcery,方法一样的。

首先,下载:链接:https://pan.baidu.com/s/1uQoCHzEl6HxiGQ9ykqKaoQ 密码:vxhy

然后解压,放到全局变量。

Window下的cmd命令行模式,直接 arm-linux-gnueabihf-gcc -v 查看版本。

同样的:

arm-linux-gnueabihf-gcc -shared -fPIC -o 我很棒.so hello.c

这次是有BuildID的。在板子上成功运行!

总结:Codesourcery和Linaro两个的都很不错,Codesourcery不知道是遇到了什么问题没有得出BUildID导致arm系统无法识别我的动态库。

 

 

参考文档:参考的太多了,除了我的下载资源网上有很多比较全的,我只把我用到的放在这里了。我的看的网页都放不下的啊!国内的资料真少,希望大神们带动。

 

你可能感兴趣的:(学习心得,codeSourcery,arm,交叉编译,window)