4D v19でのアプリビルド、コンポーネントの扱い

「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にチェックしたらランタイムエラーは出なくなった

「4D Progress」を使っているのは「JCL_DLG」コンポーネント側であってホストでは使っていない。にもかかわらず、ホストをビルドするときに「JCL_DLG」コンポーネントが使っている標準コンポーネント「4D Progress」も一緒にビルドしないと、ビルドはできるけど実行時にランタイムエラーになるアプリができる。ということでした。