这两天计划把用Firemonkey开发的程序编译一个Linux的版本玩玩,删除了里面用到的一些跨平台不兼容的代码。本以为用FMXLinux应该很容易就搞定了(以前编译过简单界面的程序)。这次程序由于用到了DataSnap Rest,编译的时候直接报错,如下:

[DCC Error] E2597 D:\Program Files\Embarcadero\Studio\20.0\bin\ld-linux.exe: error: cannot find -lcurl
  D:\Program Files\Embarcadero\Studio\20.0\bin\ld-linux.exe: error: cannot find -lz
  d:\program files\embarcadero\studio\20.0\lib\Linux64\release\Linuxapi.Curl.o:Linuxapi.Curl:function Linuxapi::Curl::curl_global_init(int): error: undefined reference to 'curl_global_init'
  d:\program files\embarcadero\studio\20.0\lib\Linux64\release\Linuxapi.Curl.o:Linuxapi.Curl:function Linuxapi::Curl::curl_global_cleanup(): error: undefined reference to 'curl_global_cleanup'
  d:\program files\embarcadero\studio\20.0\lib\Linux64\release\Linuxapi.Curl.o:Linuxapi.Curl:function Linuxapi::Curl::curl_slist_append(curl_slist*, char*): error: undefined reference to 'curl_slist_append'
  d:\program files\embarcadero\studio\20.0\lib\Linux64\release\Linuxapi.Curl.o:Linuxapi.Curl:function Linuxapi::Curl::curl_slist_free_all(curl_slist*): error: undefined reference to 'curl_slist_free_all'
  d:\program files\embarcadero\studio\20.0\lib\Linux64\release\Linuxapi.Curl.o:Linuxapi.Curl:function Linuxapi::Curl::curl_easy_strerror(CURLcode): error: undefined reference to 'curl_easy_strerror'
  d:\program files\embarcadero\studio\20.0\lib\Linux64\release\Linuxapi.Curl.o:Linuxapi.Curl:function Linuxapi::Curl::curl_easy_init(): error: undefined reference to 'curl_easy_init'
  d:\program files\embarcadero\studio\20.0\lib\Linux64\release\Linuxapi.Curl.o:Linuxapi.Curl:function Linuxapi::Curl::curl_easy_setopt(void*, CURLoption): error: undefined reference to 'curl_easy_setopt'
  d:\program files\embarcadero\studio\20.0\lib\Linux64\release\Linuxapi.Curl.o:Linuxapi.Curl:function Linuxapi::Curl::curl_easy_perform(void*): error: undefined reference to 'curl_easy_perform'
  d:\program files\embarcadero\studio\20.0\lib\Linux64\release\Linuxapi.Curl.o:Linuxapi.Curl:function Linuxapi::Curl::curl_easy_cleanup(void*): error: undefined reference to 'curl_easy_cleanup'
  d:\program files\embarcadero\studio\20.0\lib\Linux64\release\Linuxapi.Curl.o:Linuxapi.Curl:function Linuxapi::Curl::curl_easy_getinfo(void*, CURLINFO): error: undefined reference to 'curl_easy_getinfo'
  d:\program files\embarcadero\studio\20.0\lib\Linux64\release\System.ZLib.o:System.ZLib:function System::Zlib::deflate(System::Zlib::z_stream&, int): error: undefined reference to 'deflate'
  d:\program files\embarcadero\studio\20.0\lib\Linux64\release\System.ZLib.o:System.ZLib:function System::Zlib::deflateEnd(System::Zlib::z_stream&): error: undefined reference to 'deflateEnd'
  d:\program files\embarcadero\studio\20.0\lib\Linux64\release\System.ZLib.o:System.ZLib:function System::Zlib::inflate(System::Zlib::z_stream&, int): error: undefined reference to 'inflate'
  d:\program files\embarcadero\studio\20.0\lib\Linux64\release\System.ZLib.o:System.ZLib:function System::Zlib::inflateEnd(System::Zlib::z_stream&): error: undefined reference to 'inflateEnd'
  d:\program files\embarcadero\studio\20.0\lib\Linux64\release\System.ZLib.o:System.ZLib:function System::Zlib::inflateReset(System::Zlib::z_stream&): error: undefined reference to 'inflateReset'
  d:\program files\embarcadero\studio\20.0\lib\Linux64\release\System.ZLib.o:System.ZLib:function System::Zlib::deflateInit2_(System::Zlib::z_stream&, int, int, int, int, int, char*, int): error: undefined reference to 'deflateInit2_'
  d:\program files\embarcadero\studio\20.0\lib\Linux64\release\System.ZLib.o:System.ZLib:function System::Zlib::inflateInit2_(System::Zlib::z_stream&, int, char*, int): error: undefined reference to 'inflateInit2_'

看了看编译的时候执行的指令:
ld-linux1.exe -o .\\Linux64\\Release\\CarreraCRM -e _ZN10Carreracrm14initializationEv --gc-sections --dynamic-list .\\Linux64\\Release\\CarreraCRM.exp -z relro --build-id --eh-frame-hdr -m elf_x86_64 --dynamic-linker /lib64/ld-linux-x86-64.so.2 -s --sysroot D:\\mestars\\Documents\\Embarcadero\\Studio\\SDKs\\ubuntu19.04.sdk -L d:\\Program Files\\FmxLinux\\Lib\\20.0\\Release -L d:\\program files\\embarcadero\\studio\\20.0\\lib\\Linux64\\release -L D:\\mestars\\Documents\\Embarcadero\\Studio\\20.0\\Imports -L d:\\program files\\embarcadero\\studio\\20.0\\Imports -L C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\20.0\\Dcp\\Linux64 -L d:\\program files\\embarcadero\\studio\\20.0\\include -L d:\\program files\\embarcadero\\studio\\20.0\\redist\\Linux64 -L C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\20.0\\Bpl\\Linux64 -L D:\\controls\\UniDAC7.4\\Lib\\Linux64 -L D:\\controls\\UniDAC7.4\\Bin\\Linux64 -L D:\\controls\\TMSFlexCel\\Packages\\dRio\\Linux64\\Release -L D:\\controls\\TMSFlexCel\\ThirdParty\\Skia\\Linux64 -L D:\\controls\\TMS FMX UI Pack_v3.7.2.0\\library\\Linux64\\release -L D:\\mestars\\Documents\\Embarcadero\\Studio\\SDKs\\ubuntu19.04.sdk\\usr\\lib\\gcc\\x86_64-linux-gnu\\8 -L D:\\mestars\\Documents\\Embarcadero\\Studio\\SDKs\\ubuntu19.04.sdk\\usr\\lib\\x86_64-linux-gnu -L D:\\mestars\\Documents\\Embarcadero\\Studio\\SDKs\\ubuntu19.04.sdk\\lib\\x86_64-linux-gnu @.\\Linux64\\Release\\CarreraCRM.lnk -lgcc_s -lrtlhelper_PIC -lc -ldl -lpthread -lm -lpcre_PIC -lcurl -lz -lsqlite -rpath

本以为能找找Delphi在哪个模版里面添加的编译参数,把-lcurl -lz这两个参数去掉看看,结果搜索半天也没有找到。。。。
想想是不是FMXLinux的Bug?下个最新的测试版试试,结果问题依旧。
最后只好到官网看看是否有类似的Bug报告,发现还真有。而且是2017年就提了,Bug 状态 resolved,看样是官方把这个Bug已经解决啦,咋还会有呐????!
点进去看了看官方的回复是:Linux compiler some-times returns such kind of error. Just try to compile again or re-build. This is not our issue. 看来这锅官方不背啊。 只好继续。。。
看到其它回复,有的linux版本能编译通过比如:deepin 15.4 rc2,有的就不行。 看来真不是官方的锅。确实如有些人说的是不同版本的linux本身带的lib库不同,所以才会发生此类问题。

解决版本,添加相关的库,执行命令如下:

sudo apt-get install joe wget p7zip-full curl build-essential zlib1g-dev libcurl4-gnutls-dev

命令执行完,中间会有提示:
建议安装:

doc-base krb5-doc libgcrypt20-doc gmp-doc libgmp10-doc libmpfr-dev gnutls-bin gnutls-doc krb5-user

所以再执行:

sudo apt-get install doc-base krb5-doc libgcrypt20-doc gmp-doc libgmp10-doc libmpfr-dev gnutls-bin gnutls-doc krb5-user

执行完后,回到Delphi,点击Edit SDK,重新 update Local File cache。
再重新编译就搞定了


本文由 王守红 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

还不快抢沙发

添加新评论