• FreePascal


    致谢:【XE3】MN,让我加快完成了使用CodeTyphon进行交叉编译!

    CodeTyphon版本:

    6.0

    下载:http://www.pilotlogic.com/codetyphon/zips/CodeTyphonIns.zip

    主机操作系统:Windows10 X64 企业版

    主机操作系统,是当前开发和编译FreePascal程序使用的操作系统,所有编译需要的程序开发、编译、测试都在这个操作系统完成,随后在这个操作系统中,不对源代码进行任何修改的情况下,编译出目标操作系统中的程序。

    目标操作系统:Ubuntu16.04 X64

    目标操作系统,是在主机操作系统中要生成可执行程序后,实际执行这个编译出来程序的操作系统,交叉编译后的程序就是这个操作系统中的可执行文件。

    说明:CodeTyphon的交叉编译,应该可以在任意它支持的操作系统中,实现对它支持的任意操作系统的编译!!官方建议在linux下对其它操作系统的交叉编译,不要在Windows下对linux操作系统实现交叉编译,因为linux变化太快了!!我目前工作的操作系统是Windows10 X64 企业版,VM虚拟机中安装了Ubuntu16.04 X64,所以才用Windows10 X64 企业版做主机操作系统,Ubuntu16.04 X64做目标操作系统!!

     我的CodeTyphon安装目录:

    "C:codetyphon",以下出现CodeTyphon安装目录均指这个目录,你自己查找CodeTyphon安装目录时候,需要注意是否和我的安装目录一样!


     CodeTyphon真是一个强大的平台,只有你想不到的,没有它做不到的!!!

    为了用一套源码,不加任何改动,在不同操作系统生成程序,我用两种方法实现了!!!!

    一,在不同的操作系统中安装CodeTyphon:

    如何在不同操作系统安装CodeTyphon:http://www.cnblogs.com/sunylat/p/6517272.html

    这种方法比较简单实用,在一个操作系统中开发完毕程序后(编写、编译、测试都正确),最后把程序源代码拷贝到要编译的操作系统中,随后用CodeTyphon打开这个工程,和在任意操作系统中使用CodeTyphon一样,直接编译就可以了,随后就得到了在这个操作系统中的可执行文件了。

    优点:编译过程中,容易发现是否缺少当前操作系统运行FreePascal程序需要的支持库,能够在编译过程中解决这些问题。

    缺点:需要在每个操作系统中安装CodeTyphon。

    尽管这种方法安装CodeTyphon比较麻烦,但是我推荐大家用这种方法编译FreePascal的程序,就是因为它容易在编译过程中发现问题,便于提前解决了实际运行程序中需要解决的问题,不至于等运行程序时候出现问题,导致不知道究竟是哪里出了问题!!!

    上面方法只要大家会安装CodeTyphon,就能够实现,并不是这里讨论的重点,下面是本文重点讨论问题!!!!


     二,用CodeTyphon实现交叉编译: 

    交叉编译的目的,就是在一个操作系统上开发和编译程序,随后在不更换开发工具和编译程序的操作系统、不修改任何源代码的情况下,生成其它操作系统中的程序!!这对于CodeTyphon来说真是小菜一碟!!!

    1,准备编译目标操作系统程序的工具。

    2,准备编译目标操作系统程序的库。

    3,准备编译目标操作系统程序需要引用的单元文件。

    4,配置工程编译属性。

    要用CodeTyphon实现交叉编译,那么必须经过4个步骤,这4个步骤缺一不可!!对于同一主机操作系统到目标操作系统的交叉编译,如果已经完成过了交叉编译,再次进行交叉编译的时候,这些步骤中的前3项应该不需要了,只需要注意检查一下编译工程配置属性就可以了!!!

    下面我就对上面4个步骤做详细说明:

    获取编译需要的工具和库的方式:

    1,在CodeTyphon中自动获取:

    优点:直观,自动完成,无须搞清楚获取的详细过程和最终如何配置。

    缺点:不一定能够一次获取成功,再次获取需要杀死先前启动的wget程序。

    2,直接到CodeTyphon公司网站下载:

    优点:可以使用断点续传的下载工具,获取成功率很高。

    缺点:需要知道获取这些需要的工具和库,最终如何配置,并且正确配置好!

    CodeTyphon默认情况下并没有提供交叉编译的工具和库,这样做也是非常容易理解的: 

    A,便于下载和安装:CodeTyphon不知道你要对哪些操作系统进行交叉编译,为了减小CodeTyphon安装包的体积,便于更快下载和安装CodeTyphon,所以没有提供更多交叉编译需要的工具和库。

    B,定制更方便随意:用户完全可以按照自己需求定制CodeTyphon交叉编译环境。 

     对于这两种获取编译需要的工具和库的方式,在下面的两个步骤1和2中我会说明,下面就对各个步骤做详细说明:

     1,准备编译目标操作系统程序的工具:

    想要编译目标操作系统的程序,那么编译工具是必须的!!!那么我就分别采用两种方式获取编译目标操作系统程序的工具!!!

    A,在CodeTyphon中自动获取:

    (1),打开下载交叉编译工具的界面:在CodeTyphon的菜单中,选择"CrossBuild"->"Download Cross Toolchains"。

    (2),在打开的获取交叉编译工具程序界面中,选择菜单"Actions"->"Get Server file List"。

    (3),获取交叉编译需要的工具列表:点击菜单"Actions"->"Get Server file List"后,稍等一下就会在原来右侧空白位置,出现一堆列表,这些就是所有CodeTyphon支持操作系统的交叉编译工具!!

    (4),选择和下载需要的交叉编译工具:点击"Start Download",用任务栏图标或菜单项目都可以执行这个操作,随后就开始选择下载的交叉编译工具了,我选择的是"win32-i386-linux.7z"。

    (5),下载交叉编译工具:开始下载后,CodeTyphon的命令窗口不断滚动各种下载信息,同时创建了一些下载的文件,包括我们要下载的交叉编译工具压缩文件。根据各自的网络状况,这个下载时间不一样,耐心等待就可以了,这个工具压缩包不大,不到4兆,应该一小会就会下载完毕!!!

    A,CodeTyphon正在下载交叉编译工具的截图。

    B,CodeTyphon下载各种文件使用工具的截图:wget,在任务管理器中,我们可以清楚看到这个下载工具正在运行中!!!

    (6),下载成功后,查看下载的交叉编译工具。当下载成功后,CodeTyphon会将下载的交叉编译工具解压缩到:"C:codetyphoninToolchains"中对应压缩包名称的目录,我下载交叉编译工具对应目录是:"C:codetyphoninToolchainswin32-i386-linux"。我打开这个目录,就会看到全部对Ubuntu16.04 X64进行交叉编译使用的全部工具了!!!

    注意问题:有可能网络状况不佳或其它原因导致wget不能正常下载我们需要的交叉编译工具,这个时候,需要在任务管理器中把当前执行下载任务的wget结束任务,wget并不会随着CodeTyphon的退出而自动退出!!!随后重新按照上面操作,重头下载!!!

    B,直接到CodeTyphon公司网站下载:既然CodeTyphon对这些交叉编译工具从网络上下载,是否我们能够找到对应工具的下载地址,不用CodeTyphon,直接用其它断点续传工具下载呢?可以,pilotlogic公司考虑非常周全,提供了所有交叉编译工具的下载地址!

    交叉编译工具下载地址: http://www.pilotlogic.com/sitejoom/index.php/downloads/category/5-toolchains

    (1),选择主机操作系统。我目前使用的是Typhon 32位IDE,所以选择了"Windows32"。

    (2),选择要下载的交叉编译工具之后,用自己喜欢的断点续传工具下载。

    (3),把成功下载的交叉编译工具解压缩到"C:codetyphoninToolchains"目录中,一定要保证把这些工具存放到"binToolchains"目录中和下载的压缩包相同名称的目录,最终这次手动下载的交叉编译工具存放目录为:"C:codetyphoninToolchainswin32-i386-linux"。

    好了,手动下载也说明完毕了,这两种方式都可以下载到交叉编译工具,根据实际情况自己选择吧!!! 

    2,准备编译目标操作系统程序的库。

     A,在CodeTyphon中自动获取:

    (1),打开下载交叉编译库的界面:在CodeTyphon的菜单中,选择"CrossBuild"->"Download OSes Libraries"。

    (2),在打开的获取交叉编译库程序界面中,选择菜单"Actions"->"Get Server file List"。

     

    (3),获取交叉编译需要的库列表:点击菜单"Actions"->"Get Server file List"后,稍等一下就会在原来右侧空白位置,出现一堆列表,这些就是所有CodeTyphon支持操作系统的库。

    (4),选择和下载需要的交叉编译库:点击"Start Download",用任务栏图标或菜单项目都可以执行这个操作,随后就开始选择下载的交叉编译库了,我选择的是"i386-linux.7z"。 

    (5),下载交叉编译库:开始下载后,CodeTyphon的命令窗口不断滚动各种下载信息,同时创建了一些下载的文件,包括我们要下载的交叉编译库压缩文件。根据各自的网络状况,这个下载时间不一样,耐心等待就可以了,这个工具压缩包不大,不到4兆,应该一小会就会下载完毕!!!

    A,CodeTyphon正在下载交叉编译库的截图。

    B,CodeTyphon下载各种文件使用工具的截图:wget,在任务管理器中,我们可以清楚看到这个下载工具正在运行中!!!

    (6),下载成功后,查看下载的交叉编译库。当下载成功后,CodeTyphon会将下载的交叉编译库解压缩到:"C:codetyphoninLibraries"中对应压缩包名称的目录,我下载交叉编译库对应目录是:"C:codetyphoninLibrariesi386-linux"。我打开这个目录,就会看到全部对Ubuntu16.04 X64进行交叉编译使用的全部库了!!!

    注意问题:有可能网络状况不佳或其它原因导致wget不能正常下载我们需要的交叉编译工具,这个时候,需要在任务管理器中把当前执行下载任务的wget结束任务,wget并不会随着CodeTyphon的退出而自动退出!!!随后重新按照上面操作,重头下载!!!

    B,直接到CodeTyphon公司网站下载:交叉编译工具可以直接手动在网上下载,库同样也可以手动在网上下载!

    交叉编译库下载地址:http://www.pilotlogic.com/sitejoom/index.php/downloads/category/3-libraries 

    (1),选择目标操作系统对应的库。我想生成Ubuntu的程序,所以选择了"i386-linux.7z "。选择完毕后,点击后面的"Download",用自己喜欢的断点续传工具下载这个库文件。

    (3),把成功下载的交叉编译库解压缩到"C:codetyphoninLibraries"目录中,一定要保证把这些库文件存放到"binToolchains"目录中和下载的压缩包相同名称的目录,最终这次手动下载的交叉编译库存放目录为:"C:codetyphoninLibrariesi386-linux"。

    好了,手动下载也说明完毕了,这两种方式都可以下载到交叉编译库,根据实际情况自己选择吧!!! 

    3,准备编译目标操作系统程序需要引用的单元文件:工具和库准备完毕后,还得准备编译目标操作系统程序的单元文件。 

    (1),从CodeTyphon的菜单选择"CrossBuild"->"FreePascal 32Bits"->"FPC32 build corss element i386-linux"。这是我这次对应的目标操作系统需要编译的单元文件,如果你不确定到底是需要哪个,那么你可以选择最上面的那项"FPC32 build corss element ALL",这会编译所有支持编译的单元文件,这样的编译时间应该是更长一些,只要耐心等待编译完毕就可以了!

    注意:一定要选择和当前Typhon对应的位数的单元编译,我使用的Typhon是32位,所以我选择了"FreePascal 32Bits"。

    (2)编译过程截图。

    (3)编译完毕截图。编译完毕后,编译窗口消失,回到CodeTyphon主界面。

    4,配置工程编译属性:完成上面步骤后,想完成交叉编译,还需要对工程属性进行设置,设置之后,我们就可以随意对设置的编译平台进行编译程序了! 

    首先启动Typhon,这是我们编译FreePascal的IDE!!

    (1),未进行交叉编译前的工程状态:这个时候,我已经在windows里面完成了这个程序代码的编写、编译,成功生成了windows下的程序:"project1.exe",现在工程目录并里面没有"project"这样的linux下的可执行文件,"project"才是我要编译出来的linux下的可执行文件!!

    (2),打开工程属性。点击Typhon的菜单"Project"->"Project Options"。

    (3),在工程属性对话框中添加linux编译属性。点击左侧的"compiler Options",随后复选右侧的"Build modes",随后点击同行后面的按钮"...",随后点击按钮"+",随后把name对应值修改成"linux",点击"OK"按钮。

    (4),点击"Libraries"下面文本框后面的"..."按钮。在弹出的选择目录对话框中,选择我们下载到的交叉编译库目录。我的库目录是:"C:codetyphoninLibrariesi386-linux"。

    (5),点击"Add"按钮,点击"OK"按钮。

    (6),确认编译需要库路径正确添加后,点击"OK"按钮。

    (7),点击左侧的"Config and Targer"项目,随后选择右侧上面的"Build modes"为"linux",随后选择下面的"Targer OS"为"linux",随后选择"Target CPU family"为"i386",随后点击"OK"按钮。

    (8),点击Typhon菜单的"Run"->"Build",交叉编译启动,最后显示结果交叉编译成功了!!!!

      三,在Ubuntu16.04 X64里面验证交叉编译程序: 在VM虚拟机里面启动Ubuntu16.04 X64,随后把编译出来的"projec1"拷贝进去,直接执行进行验证!!

    执行"projec1"没有任何反应,难道是交叉编译失败了,生成的可执行文件不好使?在shell里面执行以下试一试吧?一执行,发现原来出现错误了,错误信息如下:

    error while loading shared libraries: libgdk-x11-2.0.so.0: cannot open shared object file: No such file or directory

    错误原因:因为缺少了libgdk-x11-2.0.so.0这个库,应该只要安装对应的库就可以了!!

    解决方法:安装缺少的库文件。

    在shell里面输入下面命令:

    sudo apt-get install libgtk2.0-0:i386

    等这个库安装完毕后,再次执行"projec1" ,完美运行了!!!和在Windows10里面执行一样!!!!在Windows10对Ubuntu交叉编译成功了!!!!!

    程序在linux中运行截图:

    测试程序源码:

    unit Unit1;
    
    {$mode objfpc}{$H+}
    
    interface
    
    uses
      Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls;
    
    type
    
      { TForm1 }
    
      TForm1 = class(TForm)
        testLogBtn: TButton;
        clearBtn: TButton;
        logMemo: TMemo;
        leftPanel: TPanel;
        Panel2: TPanel;
        rightPanel: TPanel;
        Splitter1: TSplitter;
        procedure clearBtnClick(Sender: TObject);
        procedure FormResize(Sender: TObject);
        procedure FormShow(Sender: TObject);
        procedure testLogBtnClick(Sender: TObject);
      private
        //log方法
        procedure Mylog(logInfo: string);
    
        //调整左面pancel宽度
        procedure AdjustLeftPancelWidth;
      public
    
      end;
    
    var
      Form1: TForm1;
    
      logInfo: string;//log信息变量
    
    implementation
    
    {$R *.lfm}
    
    { TForm1 }
    
    procedure TForm1.clearBtnClick(Sender: TObject);
    begin
      logmemo.Clear;
    end;
    
    procedure TForm1.FormResize(Sender: TObject);
    begin
      //调整左面pancel宽度
      self.AdjustLeftPancelWidth;
    end;
    
    procedure TForm1.FormShow(Sender: TObject);
    begin
      //调整左面pancel宽度
      self.AdjustLeftPancelWidth;
    end;
    
    procedure TForm1.testLogBtnClick(Sender: TObject);
    begin
    
    
      {$IFDEF windows}
      logInfo:='当前操作系统:Windows';
      {$ENDIF}
    
      {$IFDEF linux}
      logInfo:='当前操作系统:linux';
      {$ENDIF}
    
      {$IFDEF Darwin}
      logInfo:='当前操作系统:Mac OS';
      {$ENDIF}
    
      {$IFDEF unix}
      logInfo:='当前操作系统:unix';
      {$ENDIF}
    
      self.Mylog(logInfo);
    end;
    
    procedure TForm1.Mylog(logInfo: string);
    var
      temp: string;
      oldLog: string;
    begin
      if trim(logInfo) <> '' then
      begin
    
        oldLog := trim(logMemo.Text);
        logMemo.Clear;
    
        temp := FormatDateTime('yyyy-mm-dd hh:mm:ss', now) + ' ' + trim(logInfo);
        if oldLog = '' then
        begin
          logMemo.Lines.Add(temp);
          logMemo.Lines.Add('');
        end
        else
        begin
          logMemo.Lines.Add(temp);
          logMemo.Lines.Add('');
          logMemo.Lines.Add(oldLog);
        end;
    
      end;
    end;
    
    procedure TForm1.AdjustLeftPancelWidth;
    begin
      leftPanel.Width := self.Width div 3;
    end;
    
    end.

    参考资料:

    1,http://askubuntu.com/questions/356605/ubuntu-64-bit-machinarium-error-while-loading-shared-libraries-libgtk-x11-2-0

    2,http://www.pilotlogic.com/sitejoom/index.php/wiki/98-wiki/technical/cross-build

  • 相关阅读:
    「分块」学习笔记
    「NOIP 2017」逛公园
    大假期集训模拟赛15
    大假期集训模拟赛14
    大假期集训模拟赛13
    nginx 日志升级
    nginx 日志切割
    nginx 健康检查
    sftp 管理
    Prometheus 学习
  • 原文地址:https://www.cnblogs.com/sunylat/p/6517629.html
Copyright © 2020-2023  润新知