2023年7月28日 星期五

Delphi 開發 Linux 圖形介面程式: 以 Ubuntu 22.04 LTS 為遠端環境

Delphi + Linux

從 2002-2005,Delphi 還在 Borland 的那個年代, Borland 就已經開始著手想讓 Delphi 可以開發跨平台的應用程式了。在那個年代裡,Borland 以 Object Pascal 作為基礎語言,開發了 Kylix 這個整合開發環境,提供給開發人員可以開發 Linux 應用程式的工具。

然而好景不常,Kylix 3 在 2005 年之後,就沒有更新的版本,而 Delphi、C++ Builder 也在 2009 獨立出來由 CodeGear 維護與開發後續的版本,之後又歷經了 Embacadero, Idera 兩次的變革,直到 Delphi 10,才又提供了 Linux 開發的功能。

一開始 Delphi 10 提供 Linux 開發功能,僅限於 Linux 64bit 純文字模式,無法支援使用者圖形介面 (GUI),但 Delphi 的社群在全球仍然都很強大,隔不到一年,就有歐洲的團隊開發出了 FMXLinx 的套件,可以支援 GUI 程式的開發了。可惜的是,目前 Delphi 對於 Linux 的支援仍僅支援 64bit (AMD 或者 Intel 64), ARM 64 仍舊是不支援的。

但 Delphi 對於 MacOS 應用程式的支援較廣、較深,可以支援 Intel Chip, 也支援 Apple Chip 的機種,但 Apple Chip 的機種就等同於 ARM 64,所以 Delphi 支援 ARM 64 的 Compiler 理應不是什麼問題,如果 Delphi 能製作出 ARM 64 的 Linux 應用程式,那麼 Delphi 也就可以用來開發樹莓派或者其他 IoT 開發版使用的應用程式才對,我相信這一天不會太遠了,且讓我們拭目以待。

Linux 的環境多元

Linux 從 1990 年代首次發佈之後,全球各種社群、商業團體對它都有各自的愛好,所以也如同 Unix 的發展,有著各種不同面向的分支出現,有興趣的朋友可以參考以下的圖片,圖片是從這篇網路文章找到的。


目前在全球的使用者中,使用 Ubuntu 作為個人工作電腦的作業系統應該是所有 Linux 分支當中最多的,當然 Red Hat, CentOS, Fedora, Debian 也都不少,但 Ubuntu 應該還是比例最高的,佔了全球 Linux 使用率的 33.9% (資料來源: Enterprise Apps Today)。

所以,我們就用 Ubuntu 22.04 LTS 這個版本作為介紹的對象,這是筆者在 2023/7/24 下載 Ubuntu 的時候,Ubuntu 最新的官方穩定版本。

在 Linux 的作業系統生態中,安裝程式的工具軟體分為 apt/apt-get 跟 yum 兩大陣營,Debian 系列常使用 yum,CentOS, Ubuntu系列常使用 apt/apt-get 系列,兩個陣營安裝同樣的軟體套件時,套件的名稱或多或少會有點不太一樣,所以我先挑選了最多使用者的 Ubuntu,先涵蓋最多使用者的情境。

Embarcadero 的官方文件

Embacadero 的官方網站上,有提供 Linux 系統的開發環境設定(請點擊這裡),當中的大多數步驟都正確,但在網頁中的『準備你的 Linux 開發環境: Preparing Your Linux Development Environment』當中,所提到的安裝步驟,可能是適合 Ubuntu 20.04 的,在我安裝 Ubuntu 22.04 LTS 的時候,還是遇到了不少問題。

我安裝完成所有步驟之後,建立了一個多平台裝置應用程式,不做任何異動,只用 Delphi 初始建立的空專案來跑,就出現了 cannot find -lgcc_s 的錯誤,後來還出現過 cannot find -lz 等其他錯誤。

後來我發現 Linux 上面的連結程式 ld,除了基礎安裝的程式,也需要使用到 python 的函式庫,可是 Delphi PAServer 22.0 預設會認為系統上安裝的是 python 3.7, 但 Ubuntu 22.04 預設安裝的是 python 3.10, 所以 PAServer 22.0 尋找的函式庫檔案連結不存在,在 Delphi 裡面怎麼按 F9, 或者 Ctrl + F9 都沒有用。

Ubuntu 22.04 的逃生路徑

所以筆者直接整理了從乾淨的 Ubuntu 22.04 剛安裝好,到可以直接使用 PAServer 22.0 從 Delphi 連線過來讓 GUI 順利執行起來的所有安裝指令分享給大家,Delphi 上面的設定仍然請參考 Embacadero 的官方文件喔,但仍然有點需要注意的小地方待會再分享,以下就是所有指令:

1. sudo apt update && sudo apt upgrade
2. sudo apt install -y openssh-server
3. sudo systemctl restart ssh.service

1: 先把 Ubuntu apt 的軟體包更新、升級到最新.
2: 安裝 ssh server, 讓我們可以用 FileZilla, SSH terminal 連到 Ubuntu
3. 啟動 ssh server.

4. sudo apt install -y libgl1-mesa-glx libglu1-mesa libgtk-3-common libgstreamer1.0-0 libgstreamer-plugins-base1.0-0 g++ linux-libc-dev zlib1g zlib1g-dev

4: 安裝所有需要的函式庫, Embarcadero 官方文件寫的是 libgstreamer1.0, 但 Ubuntu 22.04 的 apt 用的是 1.0-0, 所以這兩個都需要調整一下名字.

5. ls /usr/lib/x86_64-linux-gnu/libpython3.10.so.1

5: 確認 python3.10.so.1 存在於上述路徑

把 LinuxPAServer22.0.tar.gz 從 Delphi 開發機上傳到 Ubuntu 裡,我自己是把它放在使用者 dennieschang 目錄的桌面上, 路徑為 /home/dennieschang/Desktop/LinuxPAServer22.0.tar.gz

請把這一行的 dennieschang 換成您 Ubuntu 系統登入的使用者帳號名稱

6. cd /home/dennieschang/Desktop
7. tar xzvf LinuxPAServer22.0.tar.gz

6: 切換到桌面
7: 把 LinuxPAServer22.0.tar.gz 解壓縮, 此時會解出一個名為PAServer-22.0 的目錄

8. unlink /home/dennieschang/Desktop/PAServer-22.0/lldb/lib/libpython3.so 

8: 把 PAServer 22.0 裡面預設要連結的 libpython3.so 解除連結

9. sudo ln -s /usr/lib/x86_64-linux-gnu/libpython3.10.so.1 /home/dennieschang/Desktop/PAServer-22.0/lldb/lib/libpython3.so

    9: 把系統中 /usr/lib/x86_64-linux-gnu/libpython3.10.so.1 連結為 /home/dennieschang/Desktop/PAServer-22.0/lldb/lib/libpthon3.so

到了這裡,請在 Ubuntu 桌面上打開一個 Terminal (終端機),切換到 /home/dennieschang/Desktop/PAServer-22.0,然後執行 sudo ./paserver

按下 Enter 之後,可能會詢問您 root 的密碼,輸入 root 密碼後,則會請您設定 PAServer 的驗證密碼 (由您自行設定).

只有第一次要使用 sudo ./paserver,第一次如果沒有透過 sudo 來執行,Delphi 在透過 Connection Profile 連線到 Linux 的時候,可能會出現 DS Authentication Error 的錯誤訊息。

但用了第一次 sudo ./paserver 之後,之後就不用再 sudo 了,用您登入的帳號來執行 paserver 就行,而此時 Delphi 透過 Linux profile 傳送到 Linux 的應用程式,會被儲存在 /home/dennieschang/PAServer/scratch-files/您Windows上Profile名稱/ 這個目錄中,之後就無須再透過 Delphi,可以直接從 Ubuntu 執行這個應用程式了.

Parallels Desktop 注意事項

如果您使用的開發機是 Apple Chip 的 Mac 電腦,例如 M1 或者 M2 晶片系列。像筆者使用的是 Macbook Pro 2022 M2,目前是 2023 7月,我過去十多年慣用的 VMWare Fusion 還沒有 M1/M2 上面完整支援 Windows 11 Arm 的版本,所以我只好又買了一套 Parallels Desktop 18 來跑 Windows 11 Arm (不用想 Windows 10 Arm 了, 看起來微軟沒有要做這個了),然後在 Windows 11 Arm 上面安裝 Delphi Alexandria (仍然是 X86 版本喔),Windows 11 Arm 上面可以執行 Windows 32 的應用程式,除了驅動程式之外都可以。

Parallels Desktop 有一個壞處,就是預設會讓使用者把 MacOS 上面的桌面、文件等等預設的資料夾分享在 Parallels Desktop 安裝的 Windows 裡面。這個功能乍聽之下很貼心,為什麼會是壞處呢?

因為這樣的分享,在 Windows 11 Arm 裡面,會讓原本 C:\ProgramData\Users\我的使用者\Documents 這樣的路徑,變成 //Mac/home/dennieschang/Documents

而這樣的路徑,在 Windows 命令模式下,會被認為是『參數』,而非路徑,所以 ld 會找不到函式庫。

所以,如果您也是使用 Parallels Desktop 來跑 Windows 11 Arm + Delphi 的話,請記得在 Parallels Desktop 的設定當中,取消讓 Windows 使用 MacOS 的文件,取消後,再重新從 Linux 系統中下載一次 SDK 即可.

如果您也正在處理用 Delphi 開發 Linux 的環境, 提供上述的流程與指令給您參考.