交叉编译Mono

2019-07-13 03:00发布

1. 安装scratchbox

    (1) 添加软件源:
    
        sudo vim /etc/apt/sources.list
        
        最后一行添加
        
        deb http://scratchbox.org/debian/ stable main
    
    (2) 更新软件源
    
        sudo apt-get update
    
    (3) 安装软件包
    
        sudo apt-get install scratchbox-core scratchbox-libs scratchbox-devkit-qemu
    
        sudo apt-get install scratchbox-devkit-debian scratchbox-devkit-perl scratchbox-toolchain-arm-linux-cs2007q3-51sb3
    
        也可在http://www.scratchbox.org/download/files/sbox-releases/stable/tarball/下载其它交叉编译工具包,并
    
        cd /
        tar -zxvf [交叉编译工具包路径] ./
    
    (4) 禁止VDSO
    
        sudo vim /etc/sysctl.conf
    
    最后一行添加
    
        vm.vdso_enabled = 0
        vm.mmap_min_addr = 4096
    
        sudo sysctl -p
    
    (5) 添加scratchbox用户
    
        sudo /scratchbox/sbin/sbox_adduser XX
    
        groups命令查看是否添加进sbox组中
    
    
2. 配置scratchbox

    (1) 登陆scratchbox    
    
        /scratchbox/login
    
    (2) 配置并运行target
    
        输入sb-menu进入配置
    
        a. 选择Setup建立target
    
        b. 创建一个新target
        
        c. 输入target名称
        
        d. 选择compiler交叉编译器
        
        arm-linux-cs2007q3-51sb3
        
        e. 选择devkits开发辅助工具
        
        全选
        
        f. 选择模拟器
        
        qemu-arm-sb
        
        g. 解压rootstraps根目录
        
        将omap配套的rootfs.tar.gz拷贝到/scratchbox/packages/中
        cp ~/Omapl138kbe/rootfs/rootfs.tar.gz /scratchbox/packages/
        
        利用空格键选中rootfs.tar.gz,过程中出现错误也无妨
        
        h. Select target启动target
        
        i. 如果需要scratchbox与linux文件传输,利用/scratchbox/users/XX/home/XX用户主目录进行传输
        
3. 编译Mono

    由于Mono是由C代码和C#代码两部分构成,因此需要交叉编译arm原生代码和宿主机编译托管代码。
    
    (1) 编译托管代码
    
        mkdir mono-host
    
        cd mono-host
    
        tar zvf [mono-xx.tar.gz]
    
        ./configure
        
        make
        
        make install DESTDIR=`pwd`/tmptree
    
    (2) 交叉编译本地代码(在scratchbox的sangbox中)
    
        mkdir cross
        
        cd cross
        
        tar zvf [mono-xx.tar.gz]
    
        ./configure  --host=arm-linux --build=arm-linux --target=arm-linux --with-tls=pthread --disable-mcs-build --with-monotouch=no --without-mcs-docs --disable-mono-debugger CFLAGS=-DARM_FPU_NONE
        
        ./configure  --host=arm-linux --build=arm-linux --target=arm-linux --with-tls=pthread --disable-mcs-build CFLAGS=-DARM_FPU_NONE
        
        make
        
        make install DESTDIR=`pwd`/tmptree
        
    (3)    按顺序分别将托管代码与原生代码复制到/opt/nfs中
        
        cp -r mono-host/tmptree/* /opt/nfs/
        cp -r cross/tmptree/* /opt/nfs/
        
4. 运行控制台程序

    Windows下编译C#控制台程序,将Debug/bin/XX.exe拷贝到/opt/nfs/root/中
    
    arm-linux-mono XX.exe
    
5. 移植GUI (未完,待续)
    Mono中Windows Form API支持的是基于X11图形库的Linux,但Mono提供另外两种图形库的支持:GTK#和Winforms,此外还可以选择MonoMac、Qyoto、Qt4Dotnet以及wxNet作为图形库的支持。(http://www.mono-project.com/Gui_Toolkits)
    Omap-L138的ARM Linux是基于Qtopia图形库的Arago图形界面。
    作为嵌入式Linux,我们可以考虑移植X11,Qt-X11,GTK#,以及Qyoto。其中GTK#也是基于X11的,只有Qyoto是基于Qt的,而移植C#最主要的目的就是直接移植Windows程序到嵌入式Linux上,因此这里采用移植Qt-X11作为嵌入式Linux的GUI。