
如果你手里还留着一台装着 macOS 10.14 Mojave 的旧 Mac或者你只想在虚拟机里把当年的 FreePascal 开发体验找回来那这篇笔记大概率是你需要的。我最近在一台闲置的 Mojave 机器上从零装了一遍 Lazarus 开发环境从下载版本、处理系统拦截到把第一个带按钮的窗体程序跑起来整个过程比想象中更讲究——核心问题基本都集中在“版本搭配”上。Lazarus 不是装完就能顺手用的工具在 2018 年的系统上装新 IDE一不留神就会卡在编译器路径、调试器连接这类奇怪的地方。这篇就以我的实际操作过程为主线把版本选型、安装步骤、验证方法和常见坑一次说清楚。1. 动手之前先把版本这关过了Mojave 装老 IDE 的核心困境1.1 为什么 Mojave 上不能直接下最新版 Lazarus很多第一次接触 Lazarus 的人会习惯性点开官网下载最新的安装包但装到 macOS 10.14 上以后问题就来了。新版 Lazarus 在编译和链接时会调用系统自带的 SDK 和运行库但 Mojave 的系统库、Cocoa 框架接口和工具链都停在了 2018—2019 年的状态。新版 IDE 在链接阶段经常因为找不到某个较新的接口定义或框架依赖而直接失败弹出的报错又不会明确说“你系统太老”只会让你看到一个莫名其妙的 linker error。所以我给出的实际建议是在 Mojave 上不要追新选 2.0.x 系列的后期版本我自己用的是 2.0.12。这个版本发布时对应的系统版本区间覆盖了 Mojave同时它对 Cocoa widgetset、LLDB 调试器的支持也还没有后来的版本那么激进整体上是要稳一档的选择。并不是说最新版一定跑不通而是你没必要用开盲盒的心态去折腾一个本该一分钟搞定的事情。除了 IDE 本身还需要注意编译器配套。Lazarus 默认依赖 FreePascal 编译器官方安装包会捆绑特定版本的编译器2.0.12 这个组合对应的是 FPC 3.2.0。如果自己乱升级编译器IDE 内置的语法高亮、代码补全、调试符号解析都会出现版本对不上的情况。我的原则是IDE 和编译器尽量按官方捆绑关系来少做自由组合。1.2 Widgetset、FPC、编译器路径三件事一次说清Lazarus 在 macOS 上有个专门的概念叫 widgetset它决定了你写的窗体控件最终用系统的哪套界面机制来绘制。在 2.0.x 时代有 Carbon 和 Cocoa 两套可以选择。Carbon 是 macOS 早期遗留下来的老框架虽然在某些老机器上还有兼容性优势但 Apple 早就宣布它进入废弃状态在 Mojave 上能用却会遇到很多绘图细节和 Retina 高分屏的渲染问题。Cocoa 是苹果现在主推的原生框架Lazarus 项目对它的支持已经比较成熟。所以我的建议是下载安装包的时候明确选择标注为 x86_64 且面向 Cocoa 的版本不要碰 Carbon。你可能会看到安装包文件名里带 gtk2、cocoa、x86_64 这些字样macOS 用户统一选 cocoa 和 x86_64 的组合就行。这不是什么高深选择是为了让后续的窗口显示、菜单交互、中文输入法状态不再出幺蛾子。另一个提前要说清楚的概念是 FPC 编译器路径。Lazarus 本身只是一个图形 IDE真正把 Pascal 源码变成可执行文件的是 FreePascal 编译器IDE 在编译时会调用一个叫 fpc 的可执行程序然后还需要外部工具 make 来辅助构建。问题在于macOS 系统里不一定自带 make而 fpc 的路径又可能因为安装方式不同而出现在不同目录下。后面你会发现绝大多数“装好了却编译不了”的现象本质上都是这两个路径没配对。1.3 下载旧版本时如何核对安装包可靠性从官方下载渠道找到 2.0.12 并不难但 Mac 平台上很多人习惯只认 App Store 或者官网首页的“Download”按钮到了 Lazarus 这种跨平台开源项目下载入口反而分散一些。你需要进入项目官网的下载区在历史版本列表里挑对应的发行版再选择 macOS 平台的安装包。官方一般会提供 dmg 或 pkg 两种格式我建议优先用 dmg 格式因为它的目录结构更透明安装失败也更容易清理pkg 格式会把组件写入系统目录卸载时反而麻烦。下载完成后花 30 秒做一件事核对安装包的 SHA-256 校验值。很多老开发者不在乎这一步但开源软件下载源比较多镜像不同步的情况确实存在。SHA-256 这串字符能确认你拿到的文件和官方发布的一致别等编译报错或者文件损坏时才来后悔那时候排查方向都乱了。核对命令很简单在“终端”里对下载文件跑一次shasum -a 256 文件路径再把输出的字符串和官方记录对比即可。这一步不是形式主义是给整个环境准备打下第一个稳定的底。2. 安装与首次启动这几个步骤最容易翻车2.1 安装包的挂载与拖拽细节拿到 dmg 文件后双击会挂载出一个磁盘镜像窗口。按 macOS 的常规逻辑里面放着一个 Lazarus 应用图标和一个指向 Applications 文件夹的快捷方式你只需要把图标拖进去就完成安装了。不过这个项目有时会附带额外的组件目录比如 Frameworks 或者 compiler 相关的辅助文件你最好先展开看下窗口内容确认是否只有单一 app。如果窗口里除了 app 还有别的说明文件一律保留原样别乱删。拖拽完成之后别急着双击打开。先去“应用程序”文件夹确认 Lazarus 图标是否真的存在并且尺寸正常——有几次安装看起来成功实际是拖拽中断了图标带着半透明的拷贝状态这时候直接删掉残留文件再来一次不要试图修复重装比清理半成品快得多。如果是 pkg 格式安装过程会走系统安装器让你输入管理员密码然后自动把程序写到 /Applications 或 /usr/local 这类目录。这种方式省事但对后续手动指定编译器路径来说你需要额外记住 pkg 把 fpc 装到了哪里。从排查和维护的角度看dmg 拖拽方式更适合我今天说的这套步骤建议你优先复现它。2.2 Gatekeeper 拦截与右键打开大法把 Lazarus 从网上下载下来以后macOS 10.14 系统默认的安全机制会对它进行隔离检查。由于这是来自开发者的未公证应用第一次双击时通常会看到“无法验证开发者”或者“打开已取消”的提示这个窗口的样子就是让你在弹窗里点“好”然后什么也不发生。很多人以为安装失败了其实只是系统拦截了首次启动。解决办法很通用回到“应用程序”目录找到 Lazarus 图标按住 Control 键的同时单击也就是右键在菜单里选择“打开”。这时系统会再次弹出一个确认对话框但里面多了一个“打开”按钮点它就能绕过当前的 Gatekeeper 限制。这个操作只对当前这一个应用生效系统不会真的关闭全局安全保护依旧保持了比直接关防护更安全的状态。还有一个更狠的做法是执行spctl --master-disable彻底关闭 Gatekeeper甚至通过“系统设置 - 安全与隐私 - 仍要打开”来放行。我试过几次确实能解决问题但代价是所有未签名应用都失去了拦截后续随便下载一个损坏的软件包都可能直接执行安全收益太低。开发机没必要这么极端用右键打开大法已经足够。2.3 首次启动的环境探测FPC 路径与编译器配置第一次真正打开 Lazarus 时界面会经历一段不算太快的加载过程因为 IDE 要初始化组件库并扫描自带的包管理器。等主窗口出现后不要着急新建项目先去菜单栏找到 Lazarus 菜单下的 Preferences再进入 Environment 配置页的 Files 子项。在这里你会看到几个关键路径Compiler path、Make path 以及 Debugger path。正常情况下Lazarus 会在首次启动时自动探测 FPC 编译器位置。如果它没找到路径框里就会空着或者指向一个不存在的文件此时编译任何项目都会报“cannot find compiler”这一类错误。我建议你在终端里先执行一句which fpc来确认编译器是否真的在环境变量里。如果 dmg 安装包随附了 FPC它一般会被安装到 /usr/local/bin 或 Lazarus.app 内部目录但不在 shell 的 PATH 里所以 IDE 自动探测也可能扑空。这时候不要凭感觉手动输入路径点路径选择框旁边的浏览按钮手动定位到 fpc 可执行文件。找到之后再用同样的方式设置 make。macOS 10.14 默认没有真正的 make 环境通常需要安装 Command Line Tools 才能获得 make 和 clang 等基础工具。如果你打开终端执行make得到 command not found先去系统触发安装命令在终端里执行xcode-select --install系统会弹出一个安装向导等它下载安装完成即可。装完之后 restart IDE再从同一配置页确认路径可用。3. 跑通第一个 GUI 程序这才是安装成功与否的硬标准3.1 创建项目并写一段能跑通的 Pascal 代码很多教程讲到配置路径就让读者“快乐地用吧”但从经验看配置完不等于真的能开发必须用真实项目验证。在 IDE 菜单里选择 File - New - Project打开的对话框里选最简单的 Application 模板。这个模板会生成一个带空白窗体的 Pascal 工程包含一个主窗体文件和一个项目源文件源码结构看起来比命令行程序复杂一点但每个文件都有明确分工。为了快速验证整个工具链我会在窗体上放一个按钮从组件面板拖一个 TButton 到窗体中央然后双击它IDE 会自动跳到这个按钮的点击事件处理器里。在其中写一行调用ShowMessage(Hello from Mojave);。这里的 ShowMessage 是 Lazarus 自带的弹窗函数无需额外引入单元写完后保存项目给项目起个名字所有提示都用默认值确认即可。为什么要用 GUI 项目而不直接跑一个命令行程序因为 Lazarus 在 macOS 上的主要复杂点就是 GUI 框架的链接、资源绑定和运行时加载命令行程序缺少这些环节编译时不会暴露 Cocoa 框架的问题。等你第一次 GUI 编译通过并看到窗口弹出真实环境的验证才算闭环。之后你开发任何项目都不用担心底层环境没配好。3.2 编译、运行与代码签名问题写完代码点击工具栏上的绿色“编译并运行”按钮IDE 会先调用 make 执行构建流程再调 FPC 编译器编译。这一过程在第一次运行时会比后续慢一些因为需要生成缓存和单元文件。当你看到窗体带着那个按钮出现在屏幕上第一次的安装任务已经真正完成了。但 Mojave 还有一个老系统特有的坑如果你把生成的 app 放到桌面或“应用程序”目录里并且通过双击运行有时会没有反应或者被系统拦截即使这个程序刚刚在你自己的开发环境里运行正常。原因在于编译出的二进制没有签名系统的 LaunchServices 服务对未签名应用有些额外检查。作为开发者你不需要去买签名证书只需要用系统自带的 ad-hoc 签名方式处理一次在终端里执行codesign --force --deep -s - /路径/你的App。这会生成一个本地临时签名让程序能通过系统最基本的完整性检查。真正常规开发的 app 不会每次都让你签但你要知道这个命令存在遇到“双击没反应”时它会救你一命。还有一个更容易被忽略的点调试模式下跑的程序和独立双击运行的程序行为不一定完全一样。调试器会带着环境变量和权限启动进程所以某些依赖应用目录结构的错误只会出现在独立运行时。这不算 bug是 macOS 应用沙盒模型和历史遗留逻辑造成的理解了就好排查。3.3 命令行 FreePascal 编译作为第二路验证GUI 程序跑通后我建议再做一次命令行编译验证目的是确认 FPC 编译器本身没被 IDE 的特殊配置掩盖问题。在终端里新建一个目录写一个最基本的 Pascal 源码文件内容就一个控制台程序结构program testbegin writeln(ok); end。然后执行fpc test.pas。如果这条命令顺利生成可执行文件并输出 ok说明系统层面的 FreePascal 安装完全正常。万一这一步报了错比如找不到某个 rtl 单元或者提示接口版本不对就能快速判断是编译器安装问题还是 IDE 配置问题排查范围会缩小很多。这一步的定位方式比直接盯着 IDE 报错日志更高效因为终端输出的信息更原始不会经过 IDE 包装看到的多半是真实原因。4. 常见错误与排查方向Mojave 上的高频故障4.1 一张表看清常见启动和编译报错我把自己装机和以后实际写项目的过程中遇到的出现频率比较高的报错都理了一圈把它们整理成速查表。遇到诡异问题先查这张表比闭眼搜索关键词快得多。现象直接原因处理方式双击程序或安装包提示无法验证开发者Gatekeeper 拦截未签名应用右键 - 打开必要时执行 codesign ad-hoc 签名启动 IDE 但编译时提示找不到 fpcCompiler path 未配置在 Preferences 中浏览并重新指定 fpc 可执行文件终端执行fpc报 command not foundFPC 不在 PATH或安装不完整使用which fpc检查必要时到 Lazarus 安装包内确认路径编译时提示 cannot find unit interfacesFPC 与 Lazarus 版本不匹配尽量保持官方捆绑的 IDEFPC 组合版本make 相关错误找不到 make 命令缺少 Command Line Tools执行xcode-select --install安装系统开发者工具编译通过但双击生成的 app 无反应未签名二进制被 LaunchServices 拦截使用codesign --force --deep -s - app路径做本地签名调试时断点不生效或程序中途退出lldb 版本与调试器配置不兼容在调试器选项里切到 LLDB或使用内置的 FpDebug 模式这些问题的共同点是都不会在安装阶段暴露而是延后到编译或运行时才出现。所以动辄怀疑“安装坏了”意义不大第一反应应该是检查路径和签名这两个环境因素它们覆盖了 Mojave 上至少一半的红色错误信息。4.2 调试器 lldb 连接不上程序怎么办macOS 10.14 自带的调试工具链是 LLDB 系和远古版本上的 GDB 不太一样。Lazarus 默认会尝试使用外部调试器但老系统自带的 lldb 版本和 Lazarus 2.0.12 的组合有时会因为符号格式不兼容而无法正常 attach 到进程。表现就是调试按钮一按IDE 状态栏转半天然后弹出一个“Unable to start debugger”的提示。遇到这个情况我的建议是先把调试器类型在 IDE 里切换到内置的 FpDebug。FpDebug 是 Lazarus 自己实现的调试引擎不依赖外部 lldb/gdb对普通变量查看和断点测试完全够用。你可以在菜单栏 Run - Debugger Options 里把调试器后端的下拉框切到 FpDebug然后重启 IDE。这个方案我实测下来最稳定而且对新手来说少了一层外部工具版本干扰。如果非要保留 lldb 调试再通过xcode-select --install安装一次命令行工具有时新装的 lldb、sdktools 会覆盖旧版本的行为attach 问题也会跟着消失。4.3 界面字体发虚和其他老系统小毛病Mojave 本身对 Retina 屏幕的支持已经不错但 Lazarus 的某些界面主题在像素缩放上处理得不算完善你会看到菜单栏或代码编辑器的字体边缘发虚看起来像没开 ClearType。这不算环境问题更多是 IDE 自身的渲染选项。可以在 Preferences - Editor - Display 里找到 Font Quality 相关设置从默认切到更清晰的抗锯齿模式字体会明显改善。另外如果 IDE 在操作中突然出现一个英文提示说某个功能需要更高的 macOS 版本或新的 SDK这是正常的版本依赖提示不是安装错误。它能出现反而说明你的环境已经识别到系统版本上限了忽略它并不影响基础编译。真正的坑在于你会被这个提示吸引着去升级 macOS一旦升级新的系统又可能和这版 IDE 出现新的兼容问题。旧硬件上保持 10.14 不动反而是最省心的状态。5. 最后说一点实战取舍虚拟机方案值得认真考虑如果你手头没有真正的 Mac 设备只是想复现一个 Mojave 环境来跑 Lazarus完全没必要为这专门找一台旧电脑。用虚拟机比如 VirtualBox 或 VMware 在 macOS 镜像里装一个 Mojave再按上面流程装 Lazarus整体效果很接近原生环境。唯一需要注意的是虚拟机的显卡驱动和 Retina 缩放界面响应会稍微慢一点但编译和运行普通窗体项目没有本质区别。反过来如果你是在一台已经装了 Mojave 的物理 Mac 上做这件事那恭喜你这套方案几乎不需要额外依赖。旧 Mac 的散热和风扇会有些噪音尤其第一次编译大量单元文件时但 IDE 本身不吃性能日常写代码完全够用。而且这类旧机器最大的好处是运行安静、没有新系统的资源消耗环境一旦配好能稳定用很多年。我个人的体会是macOS 10.14 配 Lazarus 2.0.12 是一个被很多人低估但确实很稳的组合。这份老系统的保守性恰好让 FreePascal 这种对依赖非常敏感的编译器发挥得最顺。如果你还纠结要不要装大可以先按我这套流程从虚拟机试一遍二十分钟内看到第一个程序弹窗后心里自然就有答案了。这个环境搭好以后你还能顺手在里面写点小的工具类程序、算法演示或者跨平台原型完全价值感拉满。