用Lazarus编译Android工程

摘要:
在fpc的2.6和2.7后续版本中,删除了对Android的编译支持,2.5.1版本需要用作ppcrossam的编译器。尽管有一些方法可以通过使用-Flibdl.so或-Flinker-sh来生成脚本(配置ppas.sh并修改资源文件)来来回避免这个问题,但NDK使用r7或r7b版本在当前的Lazarus 1.0.2中没有问题。如果存在错误,请参阅http:

注意的事项有:

  1. lazarus0.9.3.1版本以后的LCL才支持Android,所以lazarus必须使用大于此版本号的作为开发环境。
  2. fpc在2.6及2.7后继的版本中去掉了Android的编译支持,需要使用2.5.1的版本来作为ppcrossarm的编译器。否则会出现找不到ld.so.3等错误,虽然有一些使用-FLlibdl.so 或 -FLlinker -sh 生成脚本(配置使用ppas.sh并修改资源文件)的办法来回避此问题,但经过测试,似乎并不能在apk上应用。
  3. fpc2.5.1在fpc2.4上编译能顺利完成。但是在高版本的编译器似乎不顺利,如果要编译2.5.1版本,需要预装2.4.1的FPC,编译成功后,再删除。
  4. NDK使用r7或r7b版本在目前的Lazarus1.0.2中并没有问题,早期根据网上的资料,有BUG存在

编译环境的过程

  参考http://wiki.freepascal.org/Setup_Cross_Compile_For_ARM,并在下面有一个副本http://www.cnblogs.com/littlestone08/articles  /2752782.html,需要注意的问题有以下几点

  1. 关于Bintuils,Android的汇编器as是EABI5的形式,而默认的LINUX一般都是0,需要在调用as的时候加上 -meabi= 5 $@ 的参数来调用,尤其是使用预编译器2.5.1的时候,bintuils目录应该处于/usr/local/bin中,好像当时编译的时候路径就是这样的,所以使用的时候要还原当时的编译环境
  2. 如果要使用预编译的ppcrossarm,需要在/usr/bin建立一个ppcarm软件链接,因为fpc是使用ppcarm来进行调用的。
  3. 关于.fpc.cfg的配置:要包含原默认的fpc.cfg,并要正确设置参数,比如,我的预编译工作放在我的工作目录中,目录结构为

  

mei@mei-ubuntu:~/FPC4Android$ ls
arm-linux-as  arm-linux-as_org  ppcrossarm  units
mei@mei-ubuntu:~/FPC4Android$ pwd
/home/mei/FPC4Android

 则配置文件如下

  

#INCLUDE /etc/fpc.cfg
#DEFINE DEMOTEST
#DEFINE DEMOTEST1
#DEFINE LAZARUS

-Fu/home/mei/FPC4Android/units/$fpctarget/*
-Fl/home/mei/FPC4Android/units/$fpctarget/rtl/


-a
-Sd
-Xd
-Xs

-O-

#IFDEF CPUARM
-XParm-linux-
-Xr/home/mei/FPC4Android/units/arm-linux/rtl/
-darm
-Tlinux
#ENDIF

  上面设置则可以工作。如果用源码编译,参考下面的模板

#INCLUDE /etc/fpc.cfg
#DEFINE DEMOTEST
#DEFINE DEMOTEST1
#DEFINE LAZARUS

-Fu/usr/lib/fpc/2.5.1/units/$fpctarget/*
-Fl/usr/lib/fpc/2.5.1/units/$fpctarget/rtl/

-a
-Sd
-Xd
-Xs

-O-

#IFDEF CPUARM
-XP/home/user/lazarus/fpc/binutils/
-Xr/usr/lib/fpc/2.5.1/units/arm-linux/rtl/
-Xr/home/user/lazarus/fpc/libcross
-XR/home/user/lazarus/fpc/
-darm
-Tlinux
#ENDIF

 如果编译的时候无法在lazarus的 -Fl参数中设置Android NDK的lib,则可以使用-k 界面功能使用传递-l<库>的方式尝试,我有一次就出现这种上情况,暂不知道原因。

(现在找到原因了,罪魁祸首就是上面的-XR参数,去掉后,可以找到lib了。粗粗的找了一下资料,fpc或是fpc.cfg中并没有这个选项,即使在-XR后面加上你的lib的路径,也是无事无补。)

(网上找到下面的段话:You probably have to use the -XR command line parameter to tell the compiler to instruct the linker to only search for libraries in the Android SDK。笔误?是SDK,还是NDK?)

关于Codetyphon

同样用上面的方法,在Codetyphon2.8的Lazarus版本中,console的arm可正常编译,但是AndroidLCL例程无法正常进行,在编译lcl的时候会出现语法错误,察看代码后因为是编译器的版本的原因,新版本的Lazarus用的是新版本的编译器,代码中对版本进行了条件编译,致使在旧版本中编译不能通过,,如果把Codetyphon中的lazarusl的lcl用可以编译通过的lazarus版本进行把lcl目录替换,则可以正常为编译过去,并且正常生成so库,成功的在手机上运行。这个办法不是好办法,另一个办法是使用新版本的可以支持的Android的编译器,网上可以找到2.6版本的支持Android的ppcrossarm的预编译器,安装上以后,可以正常编译AndroidLCL例子。

但是如果不使用lcl库的话,则可以不用理会也可能正常的编译。

LINUX上暂时没有测试,应该差不多的,因为曾经在测试的时候也遇到过相同的问题,只是当时没有想到用标准版本的lcl替换。

关于Codetyphon安装脚本的发布速度,Linux版本都落后于Windows版本的发布,如果使用windows版本的话,as工具直接是与Android NDK的lib的EABI值相同的,可以直接使用其编译出的Binutils.

由于平时在Linux下面折腾CodeTyphon, 相比之下,WINDOWS版本的Codetypho编译之慢,资源占用之多,简直可以不可以接受,我差点以为编译lazarus big IDE时死掉了,但由于WIN平台上没有gcc,所以使用起来简单得多,缺点是比较慢。LINUX下面的版本就快多了,但需要更深入的了解一下LINUX相关的东西,要求更多的动手能力。

关于无法找到libxxxx.so的情况

这种情况归根结底是由于fpc不准备再支持Android平台上的编译造成的,由于Android的gcc及库与标准的gcc的不兼容(使用了优化过的libc也就罢了,结果连动态库加载都不使用ld而使用linker了,造成如果你只能使用静态库的方式来进行编写,否则接标准的办法是无法移值到Android的),虽然2.5.1版本的ppcossarm for Android解决了最基本的ld.so.x的链接问题,但是要是你使用了线程,就只有哭的份了。

根据以上情况我个人认为,如果想用这个已经不被官方支持的ppcrossarm for Android,最好不要写太复杂的东西,不要有依赖的功能函数,这就大大限制了发挥的空间。

一个小插曲,当我在长时间忍受了LAZARUS BIG IDE的编译后,悲剧的发现,IDE没有messages   windows,编译的提示,出错提示,什么也看不到。结果搜索网上资料说是因为docking插件引起的,它把messages box 停靠在Edit source 窗口上了,而且不可见。解决的办法就是移除docking控件包,并且删除lazarus的用户配置目录,当然再次编译是避免不了的。

附:

FPC4Android预编译下载地址 http://sourceforge.net/projects/p-tools

免责声明:文章转载自《用Lazarus编译Android工程》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇kvm存储池和存储卷BAT文件如何注释下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Android学习笔记12:图像渲染(Shader)

在Android中,提供了Shader类专门用来渲染图像以及一些几何图形。   Shader类包括了5个直接子类,分别为:BitmapShader、ComposeShader、LinearGradient、RadialGradient以及SweepGradient。其中,BitmapShader用于图像渲染;ComposeShader用于混合渲染;Line...

iOS 开发中常见的错误日志处理

Outline如何获得crash日志如何解析crash日志如何分析crash日志     1. iOS策略相关     2. 常见错误标识     3. 代码bug一、如何获得crash日志当一个iOS应用程序崩溃时,系统会创建一份crash日志保存在设备上。这份crash日志记录着应用程序崩溃时的信息,通常包含着每个执行线程的栈调用信息(低内存闪退日志例...

SweetAlert弹窗使用

所需文件只有两个,一个是css,一个是js,网上比较难找,所以已上传到网盘,需要可自行下载 链接:https://pan.baidu.com/s/1ROWJqG3pzqBD7uxqLPMqtw 提取码:abab 就像这样,直接引用即可 <link rel="stylesheet" href="../statics/sweetalert/sweeta...

Asp.NET导出Excel文件乱码解决若干方法 (转)

  Asp.NET导出Excel文件乱码解决若干方法 在Asp.NET开发过程中经常会将一些列表项目导出为Excel方便用户查看和保存,但是也经常遇到文件名乱码、文件内容乱码等问题。最近我也接到了这样的Bug,现总结了若干个解决办法,供遇到问题的朋友们参考一下。希望以下的某些方法可以解决您的问题。   程序逻辑及问题  前端点击导出Excel之后,从后台...

Android Studio升级3.6 Build窗口出现中文乱码问题解决方案

1、Android Studio升级3.6后, Build窗口出现中文乱码问题 2、解决方案 点击Help—>Edit Custom VM Options 然后在打开的文件中添加一句 -Dfile.encoding=UTF-8    然后重启Android Studio 然后你就会发现,中文乱码的问题解决了...

vue:axios拦截器

拦截器分两类:请求拦截器和响应拦截器 一、请求拦截器 在请求发出之前设置一些信息。比如说设置请求头, 在use方法参数即第一个函数的形参中通过config来做信息的配置,配置完之后,必须把config返回,这样才能完成拦截器的功能。第二个函数用于处理错误的信息。 用拦截器的方式配置请求头会更加灵活。拦截器中可以通过config获取更多的信息,比如url地...