zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    ASP.NET Web API 控制器执行过程(一)
    ASP.NET Web API 控制器创建过程(二)
    ASP.NET Web API 控制器创建过程(一)
    ASP.NET Web API WebHost宿主环境中管道、路由
    ASP.NET Web API Selfhost宿主环境中管道、路由
    ASP.NET Web API 管道模型
    ASP.NET Web API 路由对象介绍
    ASP.NET Web API 开篇示例介绍
    ASP.NET MVC 视图(五)
    ASP.NET MVC 视图(四)
  • 原文地址:https://www.cnblogs.com/sunylat/p/6517629.html
Copyright © 2011-2022 走看看