synopse / mORMot2

OpenSource RESTful ORM/SOA/MVC Framework for Delphi and FreePascal
https://synopse.info
Other
485 stars 122 forks source link

CrossCompile failed #262

Closed zen010101 closed 2 weeks ago

zen010101 commented 2 weeks ago

OS: Windows 11 23H2 FPC: 3.2.2 Lazarus: 3.2 i386-win32 Target: Linux aarch64

when I compiled the project, it met this linking error:

Debug: D:\laz32\cross\bin\aarch64-linux\aarch64-linux-gnu-ld.exe: D:\laz32\ccr\mORMot2\static\aarch64-linux....\static\aarch64-linux\sqlite3.o:(.data+0x268): undefined reference to `fcntl64'

synopse commented 2 weeks ago

Ensure you got the latest static release from mORMot, and also the latest cross-compiler binaries if you use FpcUpDeluxe.

zen010101 commented 2 weeks ago

Yes, I downloaded it from: https://synopse.info/files/mormot2static.7z . Here is the file information:

Name/Ext    Size    Date    Attr
libcurl.a   6,434,704   19/02/15 23:25  ----
libgcc.a    854,866 20/06/15 20:22  ----
sqlite3.o   2,607,576   24/01/02 19:47  ----

cross-compiler binaries are downloaded by FpcUpDeluxe too.

synopse commented 2 weeks ago

Ensure you deleted your cross-compiler and its cross-compiler binaries of FpcUpDeluxe, to download and install the latest version.

If it does not work, the issue come from the FpcUpDeluxe cross-compiler binaries from Windows to Linux aarch64, which are too old.

We build and maintain for aarch64 daily in our LUTI integration server (using a Mac M1 VM): https://luti.tranquil.it/get_folder_result/15c51a77-36d3-4ed7-b9c9-f18ff1931831/dGlzLXRlc3QtbW9ybW90Mi9tYWNfYXJt It uses the fpcupdeluxe cross-compiler from Linux x86_64 to Linux aarch64.

So you can always switch to the cross-compiler from Linux x86_64 to Linux aarch64.

See https://github.com/synopse/mORMot2/issues/247 https://synopse.info/forum/viewtopic.php?id=6738 https://synopse.info/forum/viewtopic.php?pid=32417

zen010101 commented 2 weeks ago

I tried using the latest cross-compiler and its corresponding binaries of FpcUpDeluxe, but unfortunately, it failed to link the project as well. It's quite disappointing.

Perhaps we should consider switching to Linux x86_64 in order to cross-compile for my Linux aarch64 target.

synopse commented 2 weeks ago

I just tried to setup, from scratch, the latest FPC + Lazarus versions using FpcUpDeluxe on Windows. I got the same error.

So it seems to be a FpcUpDeluxe problem: its cross-platform libraries for linux-aarch64 are too old. If you switch to Linux x86_64, it should work.

synopse commented 2 weeks ago

Consider using WSL under Windows if you don't want to setup a VM.

zen010101 commented 1 week ago

I have finally fixed it on my Windows.

I have decided to copy the files from a true aarch64 device to the directory located at \laz32\cross\lib\aarch64-linux. Here are my steps:

  1. Open a terminal where I can execute the scp command, such as WSL or MobaXterm...
  2. cd /mnt/c/laz32/cross/lib/aarch64-linux
  3. for f in * ; do scp user@192.168.x.x:/usr/lib/aarch64-linux-gnu/$f . ; done
  4. Rebuild the project in Lazarus on my Windows, with the target setting as aarch64-linux. Everything works fine!

There are some files that were not found on my aarch64 device, just like these:

/bin/scp: /usr/lib/aarch64-linux-gnu/crtbegin.o: No such file or directory /bin/scp: /usr/lib/aarch64-linux-gnu/crtbeginS.o: No such file or directory /bin/scp: /usr/lib/aarch64-linux-gnu/crtend.o: No such file or directory /bin/scp: /usr/lib/aarch64-linux-gnu/crtendS.o: No such file or directory /bin/scp: /usr/lib/aarch64-linux-gnu/lib64: No such file or directory /bin/scp: /usr/lib/aarch64-linux-gnu/libdouble-conversion.so.1: No such file or directory /bin/scp: /usr/lib/aarch64-linux-gnu/libffi.so.6: No such file or directory /bin/scp: /usr/lib/aarch64-linux-gnu/libfluidsynth.so.1: No such file or directory /bin/scp: /usr/lib/aarch64-linux-gnu/libgcc.a: No such file or directory /bin/scp: /usr/lib/aarch64-linux-gnu/libicudata.so.60: No such file or directory /bin/scp: /usr/lib/aarch64-linux-gnu/libicui18n.so.60: No such file or directory /bin/scp: /usr/lib/aarch64-linux-gnu/libicuuc.so.60: No such file or directory /bin/scp: /usr/lib/aarch64-linux-gnu/libjpeg.so.8: No such file or directory /bin/scp: /usr/lib/aarch64-linux-gnu/libmad.so: No such file or directory /bin/scp: /usr/lib/aarch64-linux-gnu/libmodplug.so: No such file or directory /bin/scp: /usr/lib/aarch64-linux-gnu/libmysqlclient.so: No such file or directory /bin/scp: /usr/lib/aarch64-linux-gnu/libmysqlclient.so.20: No such file or directory /bin/scp: /usr/lib/aarch64-linux-gnu/libnss_nis.so.2: No such file or directory /bin/scp: /usr/lib/aarch64-linux-gnu/libnss_nisplus.so.2: No such file or directory /bin/scp: /usr/lib/aarch64-linux-gnu/libogg.so: No such file or directory /bin/scp: /usr/lib/aarch64-linux-gnu/libpthread_nonshared.a: No such file or directory /bin/scp: /usr/lib/aarch64-linux-gnu/libQt5Pas.so: No such file or directory /bin/scp: /usr/lib/aarch64-linux-gnu/libQt5Pas.so.1: No such file or directory /bin/scp: /usr/lib/aarch64-linux-gnu/libreadline.so.7: No such file or directory /bin/scp: /usr/lib/aarch64-linux-gnu/libsndio.so.6.1: No such file or directory /bin/scp: /usr/lib/aarch64-linux-gnu/libssp_nonshared.a: No such file or directory /bin/scp: /usr/lib/aarch64-linux-gnu/libtinfo.so.5: No such file or directory /bin/scp: /usr/lib/aarch64-linux-gnu/libUMP.so: No such file or directory /bin/scp: /usr/lib/aarch64-linux-gnu/libvorbis.so: No such file or directory /bin/scp: /usr/lib/aarch64-linux-gnu/libvorbisenc.so: No such file or directory /bin/scp: /usr/lib/aarch64-linux-gnu/libvorbisfile.so: No such file or directory

I seached some of them on my device, not exists on the entire disk. So far, I haven't encountered any problems yet.