「LibraryDB」というプロジェクトをビルドした時の話。このプロジェクトは「Calendar」と「JCL_DLG」という2つのコンポーネントを使っている。2つのコンポーネントは4D v18のプロジェクト(M1非対応)では問題なくビルドできている。
最初の気づき現象
macOS(M1マシン)とv19でビルドしたら、実行時にコンポーネントをロードできない、というエラーが出る。コンポーネントもv19でビルドする必要があるのだと気づき、やってみたら次のようなメッセージが出てコンパイルに失敗する。
- 0: バイナリー型のデータベースはApple Silicon用にはコンパイルできません。先にデータベースをプロジェクトへと変換してください。
コンポーネントをv19でコンパイル
コンポーネントをv19で開いて、互換性タブの設定を変更、【ストラクチャーをプロジェクトに書き出し】して4Dを終了。書き出されたプロジェクトを4D v19で開く。コンパイルしてアプリケーションビルドで「コンポーネントをビルド」する。ビルドはできた。
実行してみると、コンポーネント「4D Progress」をロードできない、というエラーが出る。
確かに4D Progressという標準コンポーネントはJCL_DLGで使っていた。そしてJCL_DLGの【アプリケーションビルド】の「プラグイン&コンポーネント」でチェックを外していた。4Dのデフォルトでは標準コンポーネント全部にチェックがついているが、配布する際にファイル数が多くなるため、また容量を少しでも小さくしたいために、使わないコンポーネントのチェックを外すようにしていることが災いした。これをチェックして、コンポーネントをビルド、ホストプロジェクトをビルドして実行。 相変わらずコンポーネント「4D Progress」をロードできない、というエラーが出る。
サポートに聞いたら、ホストプロジェクトでコンポーネント「4D Progress」をチェックするべし、とアドバイスされた。ホストで?と思ったがやってみたら実行できた。うーーーーん。
「4D Progress」を使っているのは「JCL_DLG」コンポーネント側であってホストでは使っていない。にもかかわらず、ホストをビルドするときに「JCL_DLG」コンポーネントが使っている標準コンポーネント「4D Progress」も一緒にビルドしないと、ビルドはできるけど実行時にランタイムエラーになるアプリができる。ということでした。