致谢:【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.
参考资料:
2,http://www.pilotlogic.com/sitejoom/index.php/wiki/98-wiki/technical/cross-build