私はノートパソコンとデスクトップPCという2つのPCで開発を行っていたが、以下のような奇妙な症状が発生した。
症状
1つ目
デスクトップPCでソースコードをコンパイルして実行可能ファイルを作成する。このとき、vscode上のデバッガーではうまく動くが、エクスプローラやターミナルから起動しようとすると、「プロシージャエントリポイントがダイナミックリンクライブラリから見つかりませんでした。」というエラーが出る。
2つ目
デスクトップPCでコンパイルした実行可能ファイルをノートPCに転送して実行しようとしたところ、以下のような3つのエラーが出る。
- 「libgcc_s_seh-1.dll が見つからないため、コードの実行を続行できません。プログラムを再インストールすると、この問題が解決する可能性があります。」
- 「libmcfgthread-2.dll が見つからないため、コードの実行を続行できません。プログラムを再インストールすると、この問題が解決する可能性があります。」
- 「libstdc++-6.dll が見つからないため、コードの実行を続行できません。プログラムを再インストールすると、この問題が解決する可能性があります。」
3つ目
同じソースコードをノートパソコン上でコンパイルしたところ、デスクトップPC上でもノートパソコン上でも正常に動作する。
原因
原因は、GCCコンパイラの配布元の違いによる動作の差異であった。
デスクトップPCのGCCはMingw-w64のバージョンであった。この場合、デフォルトが動的リンクになる?ようである。つまり、デスクトップPC上で作成した実行可能ファイルは、知らないうちに追加のdllファイルが必要な設定になっていたのである。
一方、ノートPCにインストールしたGCCはTDM-GCCであった。これは、デフォルトで静的リンクになっており、dllファイルは必要ないというわけである。
解決策
デスクトップPCで、コンパイル時に-staticオプションを指定するように設定を変更した。私はCMakeを設定しているので,ビルドの際に以下のオプションを追加した.
-DCMAKE_CXX_FLAGS=-static
これにより、静的リンクが行われ、dllがないことによるエラーが出ないようになる。
余談
この解決策はGeminiに教えてもらった。このとおりやってみたら、少なくとも自分の環境ではそっくり解決してしまった。最近のAIはすごい。もうAIの奴隷になるしかない。